暴力bfs+hash判重咯,只有2^16个状态,直接压成二进制数。。
#include<cstdio>
#include<iostream>
#include<memory.h>
#define N 1000000
using namespace std;
struct node{
bool a[4][4];
int d;
}que[N+5],get,st,end;
char s[10];
int i,j,head,tail,hh,tt,to,u[70000];
int hash(node a)
{
int i,j,ans=0;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
ans=(ans<<1)+a.a[i][j];
return ans;
}
int bfs()
{
memset(u,0,sizeof(u));
que[1]=st;st.d=0;
hh=head=tt=tail=1;
u[hash(st)]=1;
if (hash(st)==to) return 0;
node zt;int h;
while (hh<=tt)
{
get=que[head++];hh++;
if (head>N) head=1;
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
if (get.a[i][j])
{
if (i&&!get.a[i-1][j])
{
zt=get;zt.d++;
swap(zt.a[i][j],zt.a[i-1][j]);
h=hash(zt);
if (h==to) return zt.d;
if (!u[h])
{
u[h]=1;
tail++;tt++;if (tail>N) tail=1;
que[tail]=zt;
}
}
if (i<3&&!get.a[i+1][j])
{
zt=get;zt.d++;
swap(zt.a[i][j],zt.a[i+1][j]);
h=hash(zt);
if (h==to) return zt.d;
if (!u[h])
{
u[h]=1;
tail++;tt++;if (tail>N) tail=1;
que[tail]=zt;
}
}
if (j&&!get.a[i][j-1])
{
zt=get;zt.d++;
swap(zt.a[i][j],zt.a[i][j-1]);
h=hash(zt);
if (h==to) return zt.d;
if (!u[h])
{
u[h]=1;
tail++;tt++;if (tail>N) tail=1;
que[tail]=zt;
}
}
if (j<3&&!get.a[i][j+1])
{
zt=get;zt.d++;
swap(zt.a[i][j],zt.a[i][j+1]);
h=hash(zt);
if (h==to) return zt.d;
if (!u[h])
{
u[h]=1;
tail++;tt++;if (tail>N) tail=1;
que[tail]=zt;
}
}
}
}
}
int main()
{
freopen("1054.in","r",stdin);
for (i=0;i<4;i++)
{
scanf("%s",s);
for (j=0;j<4;j++) st.a[i][j]=s[j]-'0';
}
for (i=0;i<4;i++)
{
scanf("%s",s);
for (j=0;j<4;j++) end.a[i][j]=s[j]-'0';
}
to=hash(end);
printf("%d\n",bfs());
}