📄 aiproject1dlg.cpp
字号:
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 + -