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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jiug.cpp

?? 8數碼游戲
?? CPP
字號:
// JiuG.cpp: implementation of the CJiuG class.

#include "stdafx.h"
#include "Jiugong.h"
#include "JiuG.h"
#include "math.h"//計算估價函數是會用到abs(),如果用錯位數,則不用包含
#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;//設置默認的深度為100,可以在程序中改動
}

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;
}

///////////////////////////////////////////////////////////////////
//上移,上面的左移,右移,下面的下移,結構一樣
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;//設置前趨節點
	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;
}

///////////////////////////////////////////////////////////////////
//比較兩個狀態是否相等
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;
}

///////////////////////////////////////////////////////////////////
//計算估價函數,采用了每一步移到正確的位置需要的步數
int CJiuG::ComputeFn(JGState *cur,JGState *dest)
{
	int xcur[9],ycur[9],xdest[9],ydest[9];//保存9個坐標
	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;//注釋掉的部分是采用了錯位數來計算
	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;*/
}


///////////////////////////////////////////////////////////////////
//搜索最優解,這是程序的核心部分
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;
	//如果初始狀態和末態相同,搜索成功退出
	if(Compare(&StateInit,&StateObj)==true){
		ResultList.AddTail((void *)newstate);
		return true;
	}
	
	//將起始結點加入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表中估計值最小的節點
		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;
			}
		}
	
		//將估價函數最小的節點從Open表刪除,加入到Close表中
		OpenList.RemoveAt(OpenList.FindIndex(nindex));
		CloseList.AddTail((void *)pmin);

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

		//move to left,用了搜索深度控制。下面的右移,上移,下移程序結構相同
		//可以將相同的部分寫成函數,我沒有這樣做
		if((MoveLeft(pmin,newstate)==true)&&(newstate->curdistance<=MAXDEPTH)){
			if((Compare(newstate,&StateObj)==false)){
				//不是目標節點,則看是否可以加入到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{
				//找到目標結點
				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)){
				//不是目標節點,則看是否可以加入到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{
				//找到目標結點
				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)){
				//不是目標節點,則看是否可以加入到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{
				//找到目標結點
				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)){
				//不是目標節點,則看是否可以加入到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{
				//找到目標結點
				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
	}
}

///////////////////////////////////////////////////////////////////
//釋放內存
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;
}

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区男人的天堂| 国产精品动漫网站| 久久日一线二线三线suv| 国产午夜精品一区二区三区视频| 亚洲欧美成人一区二区三区| 蜜桃视频在线观看一区| 色噜噜久久综合| 中文乱码免费一区二区| 久久精品国产秦先生| 91视视频在线观看入口直接观看www | 精品午夜一区二区三区在线观看| 99精品视频在线观看| 2020国产精品自拍| 天天色天天操综合| 欧美在线999| 国产精品久久777777| 国内精品久久久久影院色 | 玉米视频成人免费看| 国产一二精品视频| 欧美一区二区免费观在线| 伊人夜夜躁av伊人久久| 从欧美一区二区三区| 亚洲精品一区二区三区香蕉| 午夜精品免费在线观看| 欧美亚日韩国产aⅴ精品中极品| 中文字幕乱码久久午夜不卡| 国产在线观看免费一区| 精品国产一区二区三区忘忧草| 亚洲成在人线免费| 欧美日韩免费观看一区三区| 亚洲一区二区成人在线观看| 精品久久久久一区二区国产| 午夜精品视频一区| 欧美日韩高清一区二区不卡| 一区二区欧美视频| 欧美三级三级三级爽爽爽| 亚洲综合一区二区| 欧美日韩一区三区| 五月综合激情网| 日韩一区二区三区精品视频| 麻豆一区二区99久久久久| 欧美va亚洲va在线观看蝴蝶网| 另类欧美日韩国产在线| 精品sm捆绑视频| 国产福利一区二区三区视频在线 | 国产精品羞羞答答xxdd| 337p日本欧洲亚洲大胆色噜噜| 老鸭窝一区二区久久精品| 日韩免费在线观看| 国产精品中文字幕一区二区三区| 国产亚洲va综合人人澡精品| 成人免费看的视频| 一级做a爱片久久| 欧美一级二级三级蜜桃| 黄一区二区三区| 国产欧美精品国产国产专区| 99re成人在线| 三级影片在线观看欧美日韩一区二区 | 99精品视频一区| 亚洲国产日日夜夜| 日韩欧美一区二区在线视频| 国产福利一区二区三区视频| 一区二区三区欧美日| 日韩欧美一区二区视频| 成人av在线一区二区| 亚洲国产精品尤物yw在线观看| 欧美mv日韩mv国产网站| 99精品欧美一区二区蜜桃免费 | 日韩你懂的在线观看| 国产成人午夜精品影院观看视频 | 国产精品久久久久久久久免费桃花| 97久久超碰精品国产| 日日骚欧美日韩| 欧美国产精品久久| 在线不卡中文字幕| 国产成人在线观看免费网站| 亚洲第一综合色| 日本一区二区免费在线观看视频 | 777a∨成人精品桃花网| 国产成人8x视频一区二区| 亚洲国产精品久久久男人的天堂| 精品国产一二三区| 欧美揉bbbbb揉bbbbb| 粉嫩aⅴ一区二区三区四区五区| 午夜在线电影亚洲一区| 中文字幕一区二区三区四区 | 国产精品久久久久影院色老大| 欧美日韩亚洲丝袜制服| 成人福利在线看| 黄色精品一二区| 婷婷国产在线综合| 亚洲精品一卡二卡| 国产清纯白嫩初高生在线观看91| 91.com视频| 欧美日韩久久一区| 91麻豆高清视频| 成人av资源在线观看| 国产精品一区二区不卡| 青娱乐精品视频在线| 亚洲二区在线观看| 亚洲黄色小视频| 亚洲欧美另类久久久精品2019| 国产欧美日韩在线看| 2019国产精品| 欧美大片拔萝卜| 日韩一区二区三区视频在线| 欧美巨大另类极品videosbest | 91精品国产综合久久久蜜臀粉嫩| 色网站国产精品| 波多野结衣中文字幕一区 | 91精品中文字幕一区二区三区| 91黄色激情网站| 色综合天天综合在线视频| av亚洲精华国产精华精| 成人精品在线视频观看| 不卡欧美aaaaa| 91丝袜美女网| 在线一区二区三区| 精品婷婷伊人一区三区三| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 精品国产一区二区精华| 26uuu久久综合| 国产欧美精品一区| 亚洲婷婷综合色高清在线| 国产精品美女久久久久aⅴ| 亚洲欧洲日韩一区二区三区| 中文字幕亚洲电影| 亚洲精品国产视频| 亚洲一区精品在线| 偷拍日韩校园综合在线| 蜜臀av一区二区在线观看 | 欧美亚洲动漫另类| 欧美撒尿777hd撒尿| 欧美一区二区三区视频在线| 欧美大胆一级视频| 欧美激情一区二区三区四区| 国产精品久久久久桃色tv| 亚洲乱码国产乱码精品精小说 | 91精品国产乱| 久久久久综合网| 亚洲人成在线播放网站岛国| 日韩综合在线视频| 国产精品一区一区三区| 波多野结衣亚洲一区| 欧美日韩www| 久久亚洲综合色一区二区三区 | 国产亚洲欧美中文| 亚洲视频免费观看| 免费高清成人在线| 成年人网站91| 国产精品久久夜| 日韩国产高清影视| 成人免费视频一区| 精品视频一区二区不卡| 2020国产精品| 亚洲一区在线视频| 精久久久久久久久久久| 91同城在线观看| 精品对白一区国产伦| 亚洲一区日韩精品中文字幕| 国产一区二区中文字幕| 欧美视频在线观看一区二区| 国产午夜精品一区二区三区四区 | 国产一区在线不卡| 一本一道综合狠狠老| 日韩欧美在线1卡| 亚洲精品高清视频在线观看| 国产呦精品一区二区三区网站| 色悠悠亚洲一区二区| 久久欧美中文字幕| 日本欧美一区二区在线观看| 91丨国产丨九色丨pron| 国产丝袜欧美中文另类| 蜜桃免费网站一区二区三区| 欧美无砖专区一中文字| 国产精品你懂的在线欣赏| 蜜臂av日日欢夜夜爽一区| 欧美这里有精品| 亚洲欧美在线高清| 成人精品国产一区二区4080| 欧美v日韩v国产v| 日韩高清不卡在线| 欧美日本在线视频| 亚洲精品第1页| 99久久免费视频.com| 中文字幕精品一区二区三区精品| 久久国产乱子精品免费女| 欧美久久久久中文字幕| 亚洲午夜免费视频| 日本高清免费不卡视频| 综合激情网...| 99久久99久久精品国产片果冻| 中文成人综合网| 不卡av免费在线观看| 国产欧美日韩激情| 成人激情黄色小说| 中文字幕一区二区三区四区不卡| 成人激情电影免费在线观看| 国产精品欧美一区喷水| 97se亚洲国产综合自在线|