⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aiproject1dlg.cpp

📁 人工智能搜索法解决九宫重排问题(又称8数码问题)。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			for(j=0;j<12;j++)
			{
				nodeForExp[i][j]=nodeForExp[i+1][j];				
			}
	m_forExpNum--;
	if((nodeForExp[1][0]>=m_minPrice)||(m_forExpNum==0))
	{
		j=0;
		if(nodeForExp[1][0]==m_minPrice)
			j+=m_forExpNum;
		for(i=1;i<=m_expNodeNum;i++)
			if(m_minPrice==expNode[i][0])
			{
				j++;
				for(int m=0;m<12;m++)
					nodeForExp[j][m]=expNode[i][m];
			}
			m_forExpNum=j;
	}	
	
	
	for(j=1;j<10;j++)
		{	
			this->nodePath[m_timesCount][j]=nodeForExp[1][j];	
	}
	m_timesCount++;		
	}while(m_timesCount<times+1);

	for(i=0;i<m_timesCount;i++){
					for(j=1;j<10;j++)
					{	
						m_strEdit.Format(m_strEdit+"%d ",this->nodePath[i][j]);
						if(j%3==0)
						m_strEdit.Format(m_strEdit+"\r\n\t");
					}	
						m_strEdit.Format(m_strEdit+"\r\n\t");
				}
	m_strEdit.Format(m_strEdit+"\r\nFailed!\r\nState not found!");
	m_nDepth=nodeForExp[1][10];
	m_nTimes=200;
	this->UpdateData(FALSE);
	MessageBox("Expand times exceed 200!\r\nState not found!");	
}

int CAIProject1Dlg::CostFunction1(int *costTmptNode)
{
	int cost;
		int i=0;
		i=(costTmptNode[1]==1)?i:++i;
		i=(costTmptNode[2]==2)?i:++i;
		i=(costTmptNode[3]==3)?i:++i;
		i=(costTmptNode[4]==8)?i:++i;
		//i=(costTmptNode[5]==0)?i:++i;
		i=(costTmptNode[6]==4)?i:++i;
		i=(costTmptNode[7]==7)?i:++i;
		i=(costTmptNode[8]==6)?i:++i;
		i=(costTmptNode[9]==5)?i:++i;
		cost=i+costTmptNode[10];
		return cost;
}

void CAIProject1Dlg::DownMove(int *node, int i)
{
	int tmp=100;
	tmp=node[i];
	node[i]=node[i+3];
	node[i+3]=tmp;
}

void CAIProject1Dlg::LeftMove(int *node, int i)
{
	int tmp=100;
	tmp=node[i];
	node[i]=node[i-1];
	node[i-1]=tmp;
}

void CAIProject1Dlg::RightMove(int *node,int i)
{	
	int tmp=100;
	tmp=node[i];
	node[i]=node[i+1];
	node[i+1]=tmp;
}

void CAIProject1Dlg::UpMove(int *node,int i)
{	
	int tmp=100;
	tmp=node[i];
	node[i]=node[i-3];
	node[i-3]=tmp;
}

int CAIProject1Dlg::NodeExpand(int* expTmptNode)
{
	int m_expNodeNum=0;
	int m_zeroPosition;
	int moveTmptNode[12];
	int m=0;

	for(int i=1;i<10;i++)
		if(expTmptNode[i]==0)break;
	m_zeroPosition=i;	
	i=0;
	switch(m_zeroPosition)
	{
	case 1: if(expTmptNode[11]!=2)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				RightMove(moveTmptNode,1);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=4)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				DownMove(moveTmptNode,1);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			break;
	case 2:if(expTmptNode[11]!=1)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				LeftMove(moveTmptNode,2);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=3)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				RightMove(moveTmptNode,2);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=5)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				DownMove(moveTmptNode,2);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			break;
	case 3: if(expTmptNode[11]!=2)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				LeftMove(moveTmptNode,3);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=6)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				DownMove(moveTmptNode,3);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			break;
	case 4:if(expTmptNode[11]!=1)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				UpMove(moveTmptNode,4);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=5)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				RightMove(moveTmptNode,4);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=7)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				DownMove(moveTmptNode,4);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			break;
	case 5:if(expTmptNode[11]!=2)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				UpMove(moveTmptNode,5);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=4)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				LeftMove(moveTmptNode,5);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=6)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				RightMove(moveTmptNode,5);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=8)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				DownMove(moveTmptNode,5);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			break;
	case 6: if(expTmptNode[11]!=3)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				UpMove(moveTmptNode,6);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=5)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				LeftMove(moveTmptNode,6);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=9)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				DownMove(moveTmptNode,6);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			break;
	case 7: if(expTmptNode[11]!=4)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				UpMove(moveTmptNode,7);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=8)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				RightMove(moveTmptNode,7);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}			
			break;
	case 8: if(expTmptNode[11]!=5)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				UpMove(moveTmptNode,8);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=7)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				LeftMove(moveTmptNode,8);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=9)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				RightMove(moveTmptNode,8);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			break;
	case 9: if(expTmptNode[11]!=6)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				UpMove(moveTmptNode,9);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}
			if(expTmptNode[11]!=8)	
			{	for(m=1;m<10;m++)
				moveTmptNode[m]=expTmptNode[m];
				LeftMove(moveTmptNode,9);
				++i;
				for(int j=1;j<10;j++)						
					expNode[i][j]=moveTmptNode[j];
			}			
			break;
	default:;
	}
	m_expNodeNum=i;
	for(i=1;i<=m_expNodeNum;i++)
	{
		expNode[i][11]=m_zeroPosition;
		expNode[i][10]=expTmptNode[10]+1;
	}
	return m_expNodeNum;
}

int CAIProject1Dlg::CostFunction2(int *costTmptNode)
{	
	int i,j,iPosition[2],distance1,distance2;
	int targetPosition[9][2]={{0,0},{0,0},{0,1},{0,2},{1,2},{2,2},{2,1},{2,0},{1,0}};
	int cost=0;	

	for(i=1;i<9;i++)
	{
		for(j=1;j<10;j++)
		 if(costTmptNode[j]==i)break;
		 j--; 
		iPosition[0]=j/3;
		iPosition[1]=j%3;
		distance1=iPosition[0]-targetPosition[i][0];
		distance1=(distance1>0)?distance1:-distance1;
		distance2=iPosition[1]-targetPosition[i][1];
		distance2=(distance2>0)?distance2:-distance2;
		cost+=distance1+distance2;
	}
		cost+=0;
		return cost;
}


int CAIProject1Dlg::CostFunction3(int *costTmptNode)
{
	int i,j,iPosition[2],distance1,distance2;
	int targetPosition[9][2]={{0,0},{0,0},{0,1},{0,2},{1,2},{2,2},{2,1},{2,0},{1,0}};
	int nextNum[9]={0,2,3,4,5,6,7,8,1};
	int cost=0,cost1=0;	

	for(i=1;i<9;i++)
	{
		for(j=1;j<10;j++)
		 if(costTmptNode[j]==i)break;
		 j--; 
		iPosition[0]=j/3;
		iPosition[1]=j%3;
		distance1=iPosition[0]-targetPosition[i][0];
		distance1=(distance1>0)?distance1:-distance1;
		distance2=iPosition[1]-targetPosition[i][1];
		distance2=(distance2>0)?distance2:-distance2;
		cost+=distance1+distance2;
	}
		
	for(i=1;i<=2;i++)
		if(costTmptNode[i+1]!=nextNum[(costTmptNode[i])]&costTmptNode[i]!=0)cost1+=2;
	for(i=3;i<=6;i+=3)
		if(costTmptNode[i+3]!=nextNum[(costTmptNode[i])]&costTmptNode[i]!=0)cost1+=2;
	for(i=8;i<=9;i++)
		if(costTmptNode[i-1]!=nextNum[(costTmptNode[i])]&costTmptNode[i]!=0)cost1+=2;
	for(i=4;i<=7;i+=3)
		if(costTmptNode[i-3]!=nextNum[(costTmptNode[i])]&costTmptNode[i]!=0)cost1+=2;
	if(costTmptNode[5]!=0)cost1++;
	cost=cost1*3+cost;	
	//cout<<"cost="<<cost<<"\n";
	return cost;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -