#include<cstdio>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
map<int,int>ans;
int ed=123804765;
int M[4][4];
int fx[]={1,-1,0,0};
int fy[]={0,0,1,-1};
int main(){
int st;scanf("%d",&st);
queue<int>q;
q.push(st);ans[st]=0;
while(q.size()!=0){
int pre=q.front();q.pop();
int x_now,y_now;
int x=pre;
for(int i=3;i>=1;--i)
for(int j=3;j>=1;--j){
M[i][j]=x%10;
if(M[i][j]==0){
x_now=i;
y_now=j;
}
x/=10;
}
for(int p=0;p<4;++p){
int x_nxt=x_now+fx[p];
int y_nxt=x_now+fy[p];
if(x_nxt<1||x_nxt>3||y_nxt<1||y_nxt>3)continue;
swap(M[x_now][y_now],M[x_nxt][y_nxt]);
int now=0;
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
now=now*10+M[i][j];
swap(M[x_now][y_now],M[x_nxt][y_nxt]);
if(ans.count(now)) continue;
ans[now]=ans[pre]+1;
if(now==ed)break;
q.push(now);
}
}
printf("%d",ans[ed]);
return 0;
}
为啥样例也挂掉了。求救!!!