亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? jiug.cpp

?? 求解八數(shù)碼難題
?? CPP
字號(hào):
// JiuG.cpp: implementation of the CJiuG class.

#include "stdafx.h"
#include "Jiugong.h"
#include "JiuG.h"
#include "math.h"//計(jì)算估價(jià)函數(shù)是會(huì)用到abs(),如果用錯(cuò)位數(shù),則不用包含
#include "stdlib.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CJiuG::CJiuG()
{
	m_ndepth=100;//設(shè)置默認(rèn)的深度為100,可以在程序中改動(dòng)
}

CJiuG::~CJiuG()
{

}

/////////////////////////////////////////////////////////////////////
//左移
bool CJiuG::MoveLeft(JGState *src,JGState *result)
{
	int x,y,tempx,tempy;
	for(x=0;x<3;x++){
		for(y=0;y<3;y++){
			if(src->state[x][y]==0){
				tempx=x;
				tempy=y;
			}
		}
	}

	if(tempy==0)
		return false;

	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			result->state[i][j]=src->state[i][j];
		}
	}
	
	result->state[tempx][tempy] = src->state[tempx][tempy-1];
	result->state[tempx][tempy-1] = 0;
	result->curdistance=src->curdistance+1;
	result->prestate=src;
	result->nextstate=NULL;

	return true;
}

////////////////////////////////////////////////////////////////////
//右移
bool CJiuG::MoveRight(JGState *src,JGState *result)
{
	int x,y,tempx,tempy;
	for(x=0;x<3;x++){
		for(y=0;y<3;y++){
			if(src->state[x][y]==0){
				tempx=x;
				tempy=y;
			}
		}
	}

	if(tempy==2)
		return false;

	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			result->state[i][j]=src->state[i][j];
		}
	}

	result->state[tempx][tempy]=src->state[tempx][tempy+1];
	result->state[tempx][tempy+1]=0;
	result->curdistance=src->curdistance+1;
	result->prestate=src;
	result->nextstate=NULL;

	return true;
}

///////////////////////////////////////////////////////////////////
//上移,上面的左移,右移,下面的下移,結(jié)構(gòu)一樣
bool CJiuG::MoveUp(JGState *src,JGState *result)
{
	int x,y,tempx,tempy;
	//尋找空格位置
	for(x=0;x<3;x++){
		for(y=0;y<3;y++){
			if(src->state[x][y]==0){
				tempx=x;
				tempy=y;
			}
		}
	}

	//判斷是否可移
	if(tempx==0)
		return false;

	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			result->state[i][j]=src->state[i][j];
		}
	}

	result->state[tempx][tempy]=src->state[tempx-1][tempy];
	result->state[tempx-1][tempy]=0;
	result->curdistance=src->curdistance+1;//深度加一
	result->prestate=src;//設(shè)置前趨節(jié)點(diǎn)
	result->nextstate=NULL;

	return true;
}

////////////////////////////////////////////////////////////////////
//下移
bool CJiuG::MoveDown(JGState *src,JGState *result)
{
	int x,y,tempx,tempy;
	for(x=0;x<3;x++){
		for(y=0;y<3;y++){
			if(src->state[x][y]==0){
				tempx=x;
				tempy=y;
			}
		}
	}

	if(tempx==2)
		return false;

	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			result->state[i][j]=src->state[i][j];
		}
	}

	result->state[tempx][tempy]=result->state[tempx+1][tempy];
	result->state[tempx+1][tempy]=0;
	result->curdistance=src->curdistance+1;
	result->prestate=src;
	result->nextstate=NULL;

	return true;
}

///////////////////////////////////////////////////////////////////
//比較兩個(gè)狀態(tài)是否相等
bool CJiuG::Compare(JGState *src1,JGState *src2)
{
	for(int i=0;i<=2;i++){
		for(int j=0;j<=2;j++){
			if(src1->state[i][j]!=src2->state[i][j])
				return false;
		}
	}

	return true;
}

///////////////////////////////////////////////////////////////////
//計(jì)算估價(jià)函數(shù),采用了每一步移到正確的位置需要的步數(shù)
int CJiuG::ComputeFn(JGState *cur,JGState *dest)
{
	int xcur[9],ycur[9],xdest[9],ydest[9];//保存9個(gè)坐標(biāo)
	int i,j;
	int result=0;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			xcur[cur->state[i][j]]=i;
			ycur[cur->state[i][j]]=j;
			xdest[dest->state[i][j]]=i;
			ydest[dest->state[i][j]]=j;
		}
	}

	for(i=1;i<9;i++){
		result=result+abs(xcur[i]-xdest[i])+abs(ycur[i]-ydest[i]);
	}

	return result;
	/*int result=0;//注釋掉的部分是采用了錯(cuò)位數(shù)來計(jì)算
	int i,j;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			if(cur->state[i][j]!=dest->state[i][j])
				result++;
		}
	}

	return result;*/
}


///////////////////////////////////////////////////////////////////
//搜索最優(yōu)解,這是程序的核心部分
bool CJiuG::Search()
{
	int MAXDEPTH=m_ndepth;
	FreeList(&OpenList);
	FreeList(&CloseList);
	FreeList(&ResultList);
	JGState *newstate,*pstart;
	int i,k;
	newstate=(JGState *)malloc(sizeof(JGState));
	CopyJG(&StateInit,newstate);
	newstate->curdistance=0;
	newstate->nextstate=NULL;
	newstate->prestate=NULL;
	pstart=newstate;
	curstep=pstart;
	//如果初始狀態(tài)和末態(tài)相同,搜索成功退出
	if(Compare(&StateInit,&StateObj)==true){
		ResultList.AddTail((void *)newstate);
		return true;
	}
	
	//將起始結(jié)點(diǎn)加入Open表中
	OpenList.AddHead((void *)newstate);
	
	//搜索
	while(true){
		JGState *pmin;
		int nmin;
		int nindex=0;
		//Open表為空,失敗退出
		if(OpenList.IsEmpty())
			return false;
		i=OpenList.GetCount();
		nmin=100000000;
		//搜索Open表中估計(jì)值最小的節(jié)點(diǎn)
		for(k=0;k<i;k++){
			JGState *ptemp;
			ptemp=(JGState *)OpenList.GetAt(OpenList.FindIndex(k));
			int ntemp=ptemp->curdistance+ComputeFn(ptemp,&StateObj);
			if(ntemp<nmin){
				nmin=ntemp;
				pmin=ptemp;
				nindex=k;
			}
		}
	
		//將估價(jià)函數(shù)最小的節(jié)點(diǎn)從Open表刪除,加入到Close表中
		OpenList.RemoveAt(OpenList.FindIndex(nindex));
		CloseList.AddTail((void *)pmin);

		newstate=(JGState *)malloc(sizeof(JGState));

		//move to left,用了搜索深度控制。下面的右移,上移,下移程序結(jié)構(gòu)相同
		//可以將相同的部分寫成函數(shù),我沒有這樣做
		if((MoveLeft(pmin,newstate)==true)&&(newstate->curdistance<=MAXDEPTH)){
			if((Compare(newstate,&StateObj)==false)){
				//不是目標(biāo)節(jié)點(diǎn),則看是否可以加入到Open表中
				bool inopen=false;
				bool inclose=false;
				JGState *ptemp;
				//檢查是否在Open表中
				i=OpenList.GetCount();
				if(i==0)
					inopen=false;
				else{
					for(k=0;k<i;k++){
						ptemp=(JGState *)OpenList.GetAt(OpenList.FindIndex(k));
						if(Compare(newstate,ptemp)==true){
							inopen=true;
							if(ptemp->curdistance>newstate->curdistance)
								CopyJG(newstate,ptemp);
							break;
						}
					}
				}
				//檢查是否在Close表中
				i=CloseList.GetCount();
				if(i==0)
					inclose=false;
				else{
					for(k=0;k<i;k++){
						ptemp=(JGState *)CloseList.GetAt(CloseList.FindIndex(k));
						if(Compare(newstate,ptemp)==true){
							inclose=true;
							break;
						}
					}
				}
				if((inopen==false)&&(inclose==false))
					OpenList.AddHead(newstate);
			}//end if
			else{
				//找到目標(biāo)結(jié)點(diǎn)
				JGState *newstate1;
				ResultList.AddHead((void *)newstate);
				newstate=newstate->prestate;
				//回溯,得到ResultList
				while(newstate!=pstart){
					newstate1=(JGState *)malloc(sizeof(JGState));
					CopyJG(newstate,newstate1);
					ResultList.AddHead(newstate1);
					newstate=newstate->prestate;
				}
				newstate1=(JGState *)malloc(sizeof(JGState));
				CopyJG(newstate,newstate1);
				ResultList.AddHead(newstate1);
				return true;
			}//end else
		}//end if 
		else{
			free(newstate);
		}//end move left

		newstate=(JGState *)malloc(sizeof(JGState));

		//move to right
		if(MoveRight(pmin,newstate)==true&&(newstate->curdistance<=MAXDEPTH)){
			if((Compare(newstate,&StateObj)==false)){
				//不是目標(biāo)節(jié)點(diǎn),則看是否可以加入到Open表中
				bool inopen=false;
				bool inclose=false;
				JGState *ptemp;
				i=OpenList.GetCount();
				if(i==0)
					inopen=false;
				else{
					for(k=0;k<i;k++){
						ptemp=(JGState *)OpenList.GetAt(OpenList.FindIndex(k));
						if(Compare(newstate,ptemp)==true){
							inopen=true;
							if(ptemp->curdistance>newstate->curdistance)
								CopyJG(newstate,ptemp);
							break;
						}
					}
				}
				i=CloseList.GetCount();
				if(i==0)
					inclose=false;
				else{
					for(k=0;k<i;k++){
						ptemp=(JGState *)CloseList.GetAt(CloseList.FindIndex(k));
						if(Compare(newstate,ptemp)==true){
							inclose=true;
							break;
						}
					}
				}
				if((inopen==false)&&(inclose==false))
					OpenList.AddHead(newstate);
			}//end if
			else{
				//找到目標(biāo)結(jié)點(diǎn)
				JGState *newstate1;
				ResultList.AddHead((void *)newstate);
				newstate=newstate->prestate;
				while(newstate!=pstart){
					newstate1=(JGState *)malloc(sizeof(JGState));
					CopyJG(newstate,newstate1);
					ResultList.AddHead(newstate1);
					newstate=newstate->prestate;
				}
				newstate1=(JGState *)malloc(sizeof(JGState));
				CopyJG(newstate,newstate1);
				ResultList.AddHead(newstate1);
				return true;
			}//end else
		}//end if 
		else{
			free(newstate);
		}//end move right

		newstate=(JGState *)malloc(sizeof(JGState));

		//move to up
		if(MoveUp(pmin,newstate)==true&&(newstate->curdistance<=MAXDEPTH)){
			if((Compare(newstate,&StateObj)==false)){
				//不是目標(biāo)節(jié)點(diǎn),則看是否可以加入到Open表中
				bool inopen=false;
				bool inclose=false;
				JGState *ptemp;
				i=OpenList.GetCount();
				if(i==0)
					inopen=false;
				else{
					for(k=0;k<i;k++){
						ptemp=(JGState *)OpenList.GetAt(OpenList.FindIndex(k));
						if(Compare(newstate,ptemp)==true){
							inopen=true;
							if(ptemp->curdistance>newstate->curdistance)
								CopyJG(newstate,ptemp);
							break;
						}
					}
				}
				i=CloseList.GetCount();
				if(i==0)
					inclose=false;
				else{
					for(k=0;k<i;k++){
						ptemp=(JGState *)CloseList.GetAt(CloseList.FindIndex(k));
						if(Compare(newstate,ptemp)==true){
							inclose=true;
							break;
						}
					}
				}
				if((inopen==false)&&(inclose==false))
					OpenList.AddHead(newstate);
			}//end if
			else{
				//找到目標(biāo)結(jié)點(diǎn)
				JGState *newstate1;
				ResultList.AddHead((void *)newstate);
				newstate=newstate->prestate;
				while(newstate!=pstart){
					newstate1=(JGState *)malloc(sizeof(JGState));
					CopyJG(newstate,newstate1);
					ResultList.AddHead(newstate1);
					newstate=newstate->prestate;
				}
				newstate1=(JGState *)malloc(sizeof(JGState));
				CopyJG(newstate,newstate1);
				ResultList.AddHead(newstate1);
				return true;
			}//end else
		}//end if 
		else{
			free(newstate);
		}//end move up

		newstate=(JGState *)malloc(sizeof(JGState));

		//move to down
		if(MoveDown(pmin,newstate)==true&&(newstate->curdistance<=MAXDEPTH)){
			if((Compare(newstate,&StateObj)==false)){
				//不是目標(biāo)節(jié)點(diǎn),則看是否可以加入到Open表中
				bool inopen=false;
				bool inclose=false;
				JGState *ptemp;
				i=OpenList.GetCount();
				if(i==0)
					inopen=false;
				else{
					for(k=0;k<i;k++){
						ptemp=(JGState *)OpenList.GetAt(OpenList.FindIndex(k));
						if(Compare(newstate,ptemp)==true){
							inopen=true;
							if(ptemp->curdistance>newstate->curdistance)
								CopyJG(newstate,ptemp);
							break;
						}
					}
				}
				i=CloseList.GetCount();
				if(i==0)
					inclose=false;
				else{
					for(k=0;k<i;k++){
						ptemp=(JGState *)CloseList.GetAt(CloseList.FindIndex(k));
						if(Compare(newstate,ptemp)==true){
							inclose=true;
							break;
						}
					}
				}
				if((inopen==false)&&(inclose==false))
					OpenList.AddHead(newstate);
			}//end if
			else{
				//找到目標(biāo)結(jié)點(diǎn)
				JGState *newstate1;
				ResultList.AddHead((void *)newstate);
				newstate=newstate->prestate;
				while(newstate!=pstart){
					newstate1=(JGState *)malloc(sizeof(JGState));
					CopyJG(newstate,newstate1);
					ResultList.AddHead(newstate1);
					newstate=newstate->prestate;
				}
				newstate1=(JGState *)malloc(sizeof(JGState));
				CopyJG(newstate,newstate1);
				ResultList.AddHead(newstate1);
				return true;
			}//end else
		}//end if 
		else{
			free(newstate);
		}//end move down
	}
}

///////////////////////////////////////////////////////////////////
//釋放內(nèi)存
void CJiuG::FreeList(CPtrList *list)
{
	if(list->IsEmpty())
		return;
	int i=list->GetCount();
	JGState *p;
	for(int j=0;j<i;j++){
		p=(JGState *)list->GetHead();
		list->RemoveHead();
		free(p);
	}
}

void CJiuG::CopyJG(JGState *src,JGState *dest)
{
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			dest->state[i][j]=src->state[i][j];
		}
	}
	dest->curdistance=src->curdistance;
	dest->prestate=src->prestate;
	dest->nextstate=src->nextstate;
}

//////////////////////////////////////////////////////////////////
//計(jì)算逆序奇偶性,以判斷有無解,基于我對九宮問題解是否可達(dá)的證明
//返回0為偶,返回1為奇
int CJiuG::ComputeJO(JGState *jo)
{
	int result=0;
	int i,j;
	int k=0;
	int temp[8];
	//除去0,將其余8個(gè)數(shù)依次加入到數(shù)組中
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			if(jo->state[i][j]!=0){
				temp[k]=jo->state[i][j];
				k++;
			}
		}
	}
	//判斷奇偶性
	for(i=0;i<7;i++){
		for(j=i+1;j<8;j++){
			if(temp[i]>temp[j])
				result++;
		}
	}

	result=result%2;
	return result;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩亚洲欧美高清| 中文字幕一区二区不卡| www.亚洲色图| 免费一级片91| 亚洲午夜在线视频| 国产精品女人毛片| 精品88久久久久88久久久| 在线观看国产一区二区| 国产成人av一区二区三区在线 | 亚洲综合在线电影| 丝袜美腿亚洲色图| 中文欧美字幕免费| 精品久久久久久无| 欧美丰满一区二区免费视频| 95精品视频在线| 国产精品一区专区| 久久成人免费日本黄色| 亚洲夂夂婷婷色拍ww47| **性色生活片久久毛片| 国产色产综合色产在线视频| 欧美电影免费观看高清完整版在线观看 | 91麻豆蜜桃一区二区三区| 国产福利不卡视频| 麻豆精品新av中文字幕| 午夜成人免费电影| 亚洲成人av电影| 亚洲黄色小视频| 成人欧美一区二区三区黑人麻豆 | 色综合天天综合网国产成人综合天 | 日韩一区在线播放| 国产日韩欧美在线一区| 亚洲精品在线电影| 欧美成人a∨高清免费观看| 欧美一级一级性生活免费录像| 一本色道久久综合狠狠躁的推荐 | 国产亚洲一区二区三区在线观看| 日韩亚洲电影在线| 日韩一区二区电影在线| 日韩三级高清在线| 日韩精品一区二区三区视频播放 | 国产盗摄女厕一区二区三区| 久久99精品国产.久久久久 | 国产乱码精品一品二品| 国产精品综合一区二区| 国产91精品精华液一区二区三区 | 中文字幕的久久| 中文字幕欧美国产| 亚洲视频在线一区二区| 亚洲男同性恋视频| 亚洲高清一区二区三区| 视频一区中文字幕国产| 男人操女人的视频在线观看欧美| 久久精品国产一区二区| 国产毛片精品视频| 成人午夜短视频| 一本一道综合狠狠老| 欧美日韩精品欧美日韩精品 | 日韩天堂在线观看| 欧美videos中文字幕| 久久久亚洲国产美女国产盗摄| 国产日韩欧美高清| 中文字幕综合网| 亚洲国产cao| 精品综合久久久久久8888| 国产成人精品免费在线| 97超碰欧美中文字幕| 欧美日韩中文精品| 精品伦理精品一区| 国产精品久久夜| 亚洲一区中文日韩| 久久99热这里只有精品| av资源网一区| 欧美久久久久久蜜桃| 国产日韩一级二级三级| 亚洲欧美国产三级| 久久91精品国产91久久小草| 成人福利视频在线看| 欧美日韩你懂的| 精品精品国产高清一毛片一天堂| 中文字幕不卡的av| 午夜亚洲福利老司机| 国产一区二区三区日韩| 在线观看欧美黄色| 久久精品亚洲精品国产欧美 | 欧美大白屁股肥臀xxxxxx| 国产日韩av一区| 亚洲午夜激情网页| 国产成人精品1024| 7777精品伊人久久久大香线蕉完整版 | 国产精品香蕉一区二区三区| 色噜噜狠狠色综合欧洲selulu| 日韩精品一区二区三区四区视频 | 日韩综合在线视频| 成人激情文学综合网| 91精品欧美综合在线观看最新| 欧美国产日韩一二三区| 日韩成人午夜精品| 色偷偷久久一区二区三区| 精品国产精品网麻豆系列| 亚洲综合男人的天堂| 成人午夜av在线| 一区二区三区精密机械公司| 国产一区二区精品在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 日韩一区二区三区视频在线观看| 亚洲免费资源在线播放| 国产成人免费视频网站高清观看视频 | 亚洲老司机在线| 国产xxx精品视频大全| 日韩片之四级片| 亚洲成人免费电影| 91在线观看视频| 久久精品亚洲麻豆av一区二区 | 欧美嫩在线观看| 亚洲日本一区二区| 国产成人在线影院| 26uuu国产在线精品一区二区| 亚洲成人777| 色综合久久中文字幕| 国产精品高潮久久久久无| 久久国产精品露脸对白| 欧美日韩在线亚洲一区蜜芽| 一区二区三区四区不卡在线| 成人综合激情网| 久久久久久夜精品精品免费| 麻豆免费看一区二区三区| 日韩一区二区三区免费看 | 中文字幕一区二区在线观看 | 91啦中文在线观看| 国产精品毛片a∨一区二区三区| 国产成人在线视频播放| 国产亚洲福利社区一区| 国产成人av一区二区三区在线| 精品成a人在线观看| 这里是久久伊人| 亚洲成人av在线电影| 欧美精品一二三| 亚洲高清免费一级二级三级| 欧美日韩在线播放一区| 亚洲aⅴ怡春院| 欧美美女视频在线观看| 日韩综合一区二区| 欧美一区二区视频观看视频| 蜜桃视频在线观看一区二区| 日韩一级片在线观看| 另类成人小视频在线| 久久新电视剧免费观看| 国产91精品欧美| 日韩美女视频19| 欧美亚洲一区二区在线观看| 亚洲一二三区不卡| 日韩午夜电影av| 懂色中文一区二区在线播放| 中文字幕制服丝袜成人av | 欧美美女直播网站| 奇米一区二区三区| 精品国产免费人成电影在线观看四季| 国产一区二区调教| 国产精品人人做人人爽人人添| av电影在线不卡| 亚洲va欧美va天堂v国产综合| 欧美一区二区三区视频免费播放| 紧缚奴在线一区二区三区| 中文字幕不卡三区| 欧美制服丝袜第一页| 欧美96一区二区免费视频| 国产视频一区二区在线| 一本大道久久a久久精品综合| 婷婷成人激情在线网| www国产亚洲精品久久麻豆| 成人av网站在线观看| 亚洲一区二区三区在线看| 日韩无一区二区| 99国内精品久久| 亚洲国产一区二区三区青草影视| 精品嫩草影院久久| eeuss国产一区二区三区| 午夜伊人狠狠久久| 国产蜜臀av在线一区二区三区| 欧美最猛性xxxxx直播| 黄色日韩三级电影| 樱桃国产成人精品视频| 日韩欧美精品三级| 色诱视频网站一区| 久久成人免费网站| 洋洋av久久久久久久一区| 久久久综合精品| 欧美日韩国产天堂| 成人高清视频在线| 久久99精品久久久久久动态图| 中文字幕在线免费不卡| 欧美一级欧美三级在线观看| www.亚洲激情.com| 精品中文字幕一区二区小辣椒| 夜夜精品浪潮av一区二区三区| www亚洲一区| 91麻豆精品国产91久久久 | 中文字幕日本不卡| 日韩精品最新网址| 91搞黄在线观看|