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

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

?? jiug.cpp

?? 常用搜索算法
?? 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一区二区三区免费野_久草精品视频
国产精品国产三级国产aⅴ入口 | 国产精品成人一区二区三区夜夜夜 | 久久色在线观看| 久久精品久久精品| 久久久综合网站| 成人一区二区三区视频在线观看 | 亚洲精品国产精华液| 欧美体内she精高潮| 蜜臀av在线播放一区二区三区| 日韩一卡二卡三卡| 国产精品夜夜嗨| 亚洲日本护士毛茸茸| 欧美日韩高清一区二区不卡| 美腿丝袜亚洲一区| 国产精品美女视频| 欧美日韩另类国产亚洲欧美一级| 日韩黄色小视频| 久久久久国产精品麻豆| 一本色道久久综合精品竹菊| 婷婷开心激情综合| 欧美国产日韩亚洲一区| 欧美日韩国产美女| 国产精品1区2区| 亚洲一区二区三区激情| 久久一区二区三区四区| 91美女蜜桃在线| 奇米精品一区二区三区四区| 欧美韩国日本综合| 欧美日本韩国一区二区三区视频| 国产精品一区三区| 亚洲成av人片一区二区梦乃| 国产喂奶挤奶一区二区三区| 欧美日韩一级片在线观看| 国产精品综合av一区二区国产馆| 亚洲一区av在线| 久久久三级国产网站| 欧美日韩卡一卡二| 9i在线看片成人免费| 麻豆免费看一区二区三区| 亚洲免费观看高清完整版在线观看熊| 在线电影院国产精品| 91香蕉视频污| 国产福利一区在线| 秋霞影院一区二区| 一区二区三区蜜桃| 国产精品私人影院| 精品国产电影一区二区| 欧美日韩一区二区三区四区| av电影一区二区| 狠狠色丁香久久婷婷综| 视频在线观看91| 亚洲激情自拍视频| 国产精品美女久久久久久久久| 日韩一区二区免费电影| 欧美日韩激情一区二区| 色婷婷av一区二区三区大白胸| 国产成人av一区二区三区在线观看| 日韩影院在线观看| 亚洲一卡二卡三卡四卡五卡| 中文字幕一区二区三区在线不卡| 久久久久久久一区| 久久综合九色综合97婷婷| 91麻豆精品国产91久久久久久久久 | 图片区小说区区亚洲影院| 亚洲人成在线播放网站岛国| 国产精品欧美一级免费| 久久精品亚洲乱码伦伦中文| 亚洲精品在线免费播放| 精品少妇一区二区三区日产乱码| 欧美人体做爰大胆视频| 欧美视频在线观看一区| 欧美日韩亚州综合| 欧美高清视频不卡网| 777奇米成人网| 欧美日韩一区二区在线观看 | 精品国产乱码久久久久久影片| 777亚洲妇女| 欧美喷水一区二区| 制服视频三区第一页精品| 91.com视频| 欧美mv日韩mv国产| 久久久无码精品亚洲日韩按摩| 久久久精品日韩欧美| 久久蜜桃av一区二区天堂| 国产欧美日韩三区| 亚洲私人黄色宅男| 一区二区三区四区不卡在线| 亚洲国产综合在线| 美女网站在线免费欧美精品| 国产一区日韩二区欧美三区| 国产成人免费在线视频| 99久久婷婷国产综合精品电影| 91网站黄www| 在线不卡一区二区| 欧美电影免费提供在线观看| 欧美精品一区二区久久婷婷| 久久久久99精品国产片| 中文字幕在线免费不卡| 亚洲二区视频在线| 久久精品国产99| 99久久婷婷国产| 欧美日韩国产免费| 久久久亚洲精品石原莉奈| 国产精品美女一区二区在线观看| 亚洲一二三四区| 国内欧美视频一区二区| 色综合天天综合网天天看片| 69精品人人人人| 亚洲国产高清aⅴ视频| 亚洲最快最全在线视频| 精品亚洲aⅴ乱码一区二区三区| 成人国产免费视频| 欧美日韩成人一区| 国产情人综合久久777777| 一区二区三区四区五区视频在线观看 | 国产精品伦理在线| 日韩激情中文字幕| 成人久久18免费网站麻豆| 欧美日韩精品三区| 中文字幕精品一区二区精品绿巨人| 亚洲一区二区四区蜜桃| 国产麻豆一精品一av一免费| 在线观看亚洲a| 国产女人aaa级久久久级 | 国产精品国产精品国产专区不蜜| 亚洲不卡在线观看| 成人av资源在线| 精品久久久网站| 亚洲第一二三四区| av在线一区二区三区| 精品国产一区二区三区久久久蜜月| 亚洲免费高清视频在线| 国产一区二区在线视频| 欧美妇女性影城| 亚洲欧美福利一区二区| 国产精品一区二区久久精品爱涩| 欧美剧情片在线观看| 国产亚洲精品资源在线26u| 日韩专区在线视频| 97se亚洲国产综合自在线| 久久欧美一区二区| 日韩中文字幕一区二区三区| 99久久精品免费看国产| 国产欧美一区二区精品忘忧草| 免费久久99精品国产| 欧美日韩电影在线| 依依成人精品视频| 91污在线观看| 久久久久久一级片| 激情综合亚洲精品| 日韩欧美一卡二卡| 日韩av电影免费观看高清完整版 | 91福利精品视频| 国产精品对白交换视频| 国产黑丝在线一区二区三区| 日韩午夜中文字幕| 日韩**一区毛片| 91精品国产一区二区三区蜜臀| 亚洲成人免费影院| 欧美日韩国产片| 日韩精品一级中文字幕精品视频免费观看| 日本道免费精品一区二区三区| 中文字幕一区视频| 99v久久综合狠狠综合久久| 中文字幕中文字幕在线一区 | 91精品婷婷国产综合久久性色 | 亚洲免费观看视频| 99精品久久只有精品| 国产精品电影一区二区三区| 国产91色综合久久免费分享| 日本一区二区三级电影在线观看 | 久久婷婷色综合| 国产精品伊人色| 中文成人av在线| 91麻豆国产福利在线观看| 一个色在线综合| 日韩一区二区免费在线电影| 激情文学综合丁香| 国产日韩欧美高清在线| caoporm超碰国产精品| 亚洲免费在线视频一区 二区| 在线观看av一区| 捆绑变态av一区二区三区| 久久新电视剧免费观看| 成人激情午夜影院| 亚洲综合免费观看高清完整版| 欧美日韩黄色影视| 国内外成人在线| 亚洲品质自拍视频| 欧美一区二区三区白人| 国产一区高清在线| 亚洲欧美日韩系列| 欧美区在线观看| 国产精品亚洲第一区在线暖暖韩国 | 亚洲欧美日韩国产手机在线| 欧美性做爰猛烈叫床潮| 久久精品999| 亚洲欧洲精品一区二区精品久久久| 欧美专区亚洲专区| 国产美女主播视频一区|