这个题想了大约一天,想写总是少点东西,所以借鉴了很多别人的代码,这个是第一个弄懂的,先转过来,免得到时候又忘记了
#include "StdAfx.h"
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int minn=inf;
using namespace std;
int go[4][2]= {0,1,0,-1,1,0,-1,0};//方向向量
int vis[3][3][3][3][3][3];//标记数组
struct node
{
int x;
int y;
} a,b,k;//分别记录a,b和空格的坐标
void input()//处理输入
{
char s;
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
{
s=getchar();
if(s==' ')
{
k.x=i;
k.y=j;
}
if(s=='A')
{
a.x=i;
a.y=j;
}
if(s=='B')
{
b.x=i;
b.y=j;
}
}
getchar();
}
}
void dfs(int x1,int y1,int x2,int y2,int x,int y,int step)
{
if(step>minn)
return;
if(x1==b.x&&y1==b.y&&x2==a.x&&y2==a.y)//x1y1到达b x2y2到达a 难道xy是空格?
{
minn=step;
return;
}
//判断越界
if(x<0||x>1||y<0||y>2)
return;
if(x1<0||x1>1||y1<0||y1>2)
return;
if(x2<0||x2>1||y2<0||y2>2)
return;
if(vis[x1][y1][x2][y2][x][y]==1)//三个相对位置被使用过
return;
vis[x1][y1][x2][y2][x][y]=1;//标记已使用
for(int i=0; i<4; i++)
{
int xx=x+go[i][0];
int yy=y+go[i][1];
if(xx==x1&&yy==y1)//新的一步走到了A处
dfs(x,y,x2,y2,x1,y1,step+1);//int x1,int y1,int x2,int y2,int x,int y,int step 走到A处,xy和A直接交换位置带入
else if(xx==x2&&yy==y2)
dfs(x1,y1,x,y,x2,y2,step+1);//走到B处,xy和B交换带入
else
dfs(x1,y1,x2,y2,xx,yy,step+1);//和AB无关则,空格位置改变
}
vis[x1][y1][x2][y2][x][y]=0;
}
int main()
{
input();
dfs(a.x,a.y,b.x,b.y,k.x,k.y,0);
printf("%d\n",minn);
return 0;
}
转自https://blog.csdn.net/riba2534/article/details/65938125