bfs水ti
/************************************************************** Problem: 1054 User: lxy8584099 Language: C++ Result: Accepted Time:24 ms Memory:1812 kb ****************************************************************/ #include<cstdio> using namespace std; const int N=126536; int dx[]={0,0,1,-1},dy[]={1,-1,0,0}; int goal,num[N]; int q[N]; char s[120]; int main() { int k=0; for(int i=1;i<=4;i++) { scanf("%s",s+1);for(int j=1;j<=4;j++) k=((k<<1)+s[j]-'0'); } for(int i=1;i<=4;i++) { scanf("%s",s+1);for(int j=1;j<=4;j++) goal=((goal<<1)+s[j]-'0'); } num[k]=1;int l=0,r=1; q[1]=k; while(l<r) { l++;int kk=q[l]; if(kk==goal) {printf("%d\n",num[kk]-1);return 0;} for(int i=1;i<=16;i++) { if(!(kk&(1<<(i-1)))) continue; for(int j=0;j<4;j++) { if(j==0&&i%4==0) continue; if(j==2&&i%4==1) continue; k=i;int x=kk; k+=(dx[j]*4);k+=dy[j]; if(k>0&&k<=16&&(!(x&(1<<(k-1))))) { x^=(1<<(k-1));x^=(1<<(i-1)); if(!num[x]) {num[x]=num[kk]+1;q[++r]=x;} } } } } return 0; }