题意:传送门
题解:直接bfs,最重要的是设计出如何进行判重,然后可以将棋盘看成一个16进制数就可以了。
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=65536;
int bg,ed,h,xx[]={0,0,1,-1},yy[]={1,-1,0,0};
bool ans[5][5],mark[maxn];
struct data{bool a[5][5];int step;}q[maxn];
int HASH(bool a[5][5])
{
int k=1,s=0;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
s+=k*a[i][j];k<<=1;
}
}
return s;
}
void bfs()
{
int s=0,t=1;
char ch[5];
for(int i=1;i<=4;i++){
scanf("%s",ch);
for(int j=1;j<=4;j++){
q[0].a[i][j]=ch[j-1]-48;
}
}
q[0].step=0;
for(int i=1;i<=4;i++){
scanf("%s",ch);
for(int j=1;j<=4;j++){
ans[i][j]=ch[j-1]-48;
}
}
bg=HASH(q[s].a);ed=HASH(ans);
if(bg==ed){printf("%d\n",0);return ;}
mark[bg]=1;
while(s<t){
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(q[s].a[i][j]){
for(int k=0;k<4;k++){
int x=i+xx[k],y=j+yy[k];
if(q[s].a[x][y]||x<1||x>4||y<1||y>4)continue;
swap(q[s].a[i][j],q[s].a[x][y]);
h=HASH(q[s].a);
if(h==ed){printf("%d\n",q[s].step+1);return;}
if(mark[h]){swap(q[s].a[i][j],q[s].a[x][y]);continue;}
mark[h]=1;
memcpy(q[t].a,q[s].a,sizeof(q[s].a));
q[t++].step=q[s].step+1;
swap(q[s].a[i][j],q[s].a[x][y]);
}
}
}
}
s++;
}
}
int main()
{
bfs();
return 0;
}