水题.裸BFS.
AC code:
#include <cstdio>
#include <queue>
using namespace std;
int mx[5]={0,0,0,-1,1},my[5]={0,-1,1,0,0};
int a[5][5],b[5][5];
bool app[1<<17];
int getkey(int x[5][5]){
int k=0;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
k=(k<<1)|x[i][j];
return k;
}
struct Sta{
int step;
int x[5][5];
Sta(int y[5][5],int s){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
x[i][j]=y[i][j];
step=s;
}
};
void BFS(){
queue<Sta> Q;
app[getkey(a)]=1;
Q.push(Sta(a,0));
while(!Q.empty()){
Sta x=Q.front();Q.pop();
if(getkey(x.x)==getkey(b)){
printf("%d\n",x.step);
return ;
}
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(!x.x[i][j]) continue;
Sta y=x;
y.x[i][j]=0;
for(int k=1;k<=4;k++){
int xx=i+mx[k],yy=j+my[k];
if(xx<1||xx>4||yy<1||yy>4||y.x[xx][yy]) continue;
y.x[xx][yy]=1;
if(app[getkey(y.x)]){
y.x[xx][yy]=0;
continue;
}
app[getkey(y.x)]=1;
Q.push(Sta(y.x,y.step+1));
y.x[xx][yy]=0;
}
}
}
}
}
int main(){
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
char c;
scanf("%c",&c);
a[i][j]=c-'0';
}
scanf("\n");
}
scanf("\n");
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
char c;
scanf("%c",&c);
b[i][j]=c-'0';
}
scanf("\n");
}
BFS();
return 0;
}