Problem : [HAOI2008]移动玩具
原题链接:https://begin.lydsy.com/JudgeOnline/problem.php?cid=1258&pid=18
#include <cmath>
#include <cstdio>
#include <cstring>
char ch[10001];
char st[10001],ed[10001],dq[10001];
int dl[1000001],zb[1000001],h[1000001];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int js=0;
void read()
{
scanf("%s",dq+1);
st[1]=dq[1],st[2]=dq[2],st[3]=dq[3],st[4]=dq[4];
scanf("%s",dq+1);
st[5]=dq[1],st[6]=dq[2],st[7]=dq[3],st[8]=dq[4];
scanf("%s",dq+1);
st[9]=dq[1],st[10]=dq[2],st[11]=dq[3],st[12]=dq[4];
scanf("%s",dq+1);
st[13]=dq[1],st[14]=dq[2],st[15]=dq[3],st[16]=dq[4];
scanf("%s",dq+1);
ed[1]=dq[1],ed[2]=dq[2],ed[3]=dq[3],ed[4]=dq[4];
scanf("%s",dq+1);
ed[5]=dq[1],ed[6]=dq[2],ed[7]=dq[3],ed[8]=dq[4];
scanf("%s",dq+1);
ed[9]=dq[1],ed[10]=dq[2],ed[11]=dq[3],ed[12]=dq[4];
scanf("%s",dq+1);
ed[13]=dq[1],ed[14]=dq[2],ed[15]=dq[3],ed[16]=dq[4];
}
int Hash(char nu[10001])
{
int da=0;
for(int i=0;i<=15;i++)
{
if(nu[i]=='1')
{
da+=pow(2,16-i-1);
}
}
return da;
}
void zh(int t)
{
char yc[10001];
for(int i=1;i<=16;i++)
{
if(((1<<i-1)&t)>0)
{
yc[i]='1';
}
else
{
yc[i]='0';
}
}
for(int i=1;i<=16;i++)
{
ch[i]=yc[16-i+1];
}
}
void bfs()
{
int tou=1,wei=2;
h[dl[1]]=1,zb[1]=0;
while(tou<wei)
{
zh(dl[tou]);
for(int i=1;i<=16;i++)
{
if(ch[i]=='0')
{
int x=0,y=0;
if(i%4==0)
{
x=i/4;
}
else
{
x=i/4+1;
}
y=i%4;
if(y==0)
{
y=4;
}
int k=(x-1)*4+y;
for(int j=0;j<=3;j++)
{
int nx=x+dx[j];
int ny=y+dy[j];
if(nx>=1 && nx<=4 && ny>=1 && ny<=4 && ch[(nx-1)*4+ny]=='1')
{
int nk=(nx-1)*4+ny;
char now[101];
for(int t=1;t<=16;t++)
{
now[t]=ch[t];
}
now[k]='1';
now[nk]='0';
int xn=Hash(now+1);
if(xn==js)
{
printf("%d",zb[tou]+1);
return ;
}
if(h[xn]==0)
{
dl[wei]=xn;
h[xn]=wei;
zb[wei]=zb[tou]+1;
wei++;
}
}
}
}
}
tou++;
}
}
int main()
{
read();
dl[1]=Hash(st+1);
js=Hash(ed+1);
if(dl[1]==js)
{
printf("0");
return 0;
}
bfs();
return 0;
}