代码如下
#include <bits/stdc++.h>
using namespace std;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
char s[10];
int mp[66000],state[5][5],st[5][5],ed[5][5],e;
int get_hash(int a[5][5]){
int tot=0,p=1;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
tot+=a[i][j]*p,p<<=1;
return tot;
}
void get_state(int x){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
state[i][j]=x&1,x>>=1;
}
void read_and_parse(){
for(int i=1;i<=4;i++){
scanf("%s",s+1);
for(int j=1;j<=4;j++)st[i][j]=s[j]-'0';
}
for(int i=1;i<=4;i++){
scanf("%s",s+1);
for(int j=1;j<=4;j++)ed[i][j]=s[j]-'0';
}
memset(mp,-1,sizeof(mp));
e=get_hash(ed);
}
void solve(){
queue<int> q;
q.push(get_hash(st)),mp[get_hash(st)]=0;
while(q.size()){
int u=q.front();q.pop();
if(u==e)break;
get_state(u);
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(state[i][j])
for(int k=0;k<4;k++){
int x=i+dx[k],y=j+dy[k];
if(x<1||y<1||x>4||y>4)continue;
swap(state[i][j],state[x][y]);
int v=get_hash(state);
if(mp[v]==-1){
q.push(v);
mp[v]=mp[u]+1;
}
swap(state[i][j],state[x][y]);
}
}
printf("%d\n",mp[e]);
}
int main(){
read_and_parse();
solve();
return 0;
}