样例可过,悬关
#include<cstdio>
#include<queue>
using namespace std;
const int Swap[24][2]={{16,15},{15,14},{14,13},{12,11},{11,10},{10,9},{8,7},{7,6},{6,5},{4,3},{3,2},{2,1},{16,12},{12,8},{8,4},{15,11},{11,7},{7,3},{14,10},{10,6},{6,2},{13,9},{9,5},{5,1}};
const int N=16;
const int INF=0x7fffffff;
queue<int> que;
int step[1<<N];
int start,endd;
int Bit(int x,int k){
return (x>>(k-1))&1;
}
int Num(int k){
return 1<<(k-1);
}
void Bfs(){
que.push(start);
for(int i=0;i<(1<<N);i++)
step[i]=INF;
step[start]=0;
while(!que.empty()){
int now=que.front();
que.pop();
if(now==endd){
printf("%d",step[endd]);
return;
}
for(int k=0;k<24;k++){
int next=now^Num(Swap[k][0])^Num(Swap[k][1]);
if(step[now]+1<step[next]){
que.push(next);
step[next]=step[now]+1;
}
}
}
}
int main(){
// freopen("P4289.in","r",stdin);
// freopen("P4289.out","w",stdout);
for(int i=1,x;i<=16;i++){
scanf("%1d",&x);
start=(start<<1)+x;
}
for(int i=1,x;i<=16;i++){
scanf("%1d",&x);
endd=(endd<<1)+x;
}
Bfs();
return 0;
}