59 lines
1.1 KiB
C++
59 lines
1.1 KiB
C++
#include<cstdio>
|
|
#include<unordered_map>
|
|
#include<cstring>
|
|
#include<queue>
|
|
#include<algorithm>
|
|
using namespace std;
|
|
typedef long long LL;
|
|
const LL KEndStatus=123804765;
|
|
unordered_map<LL,int> res;
|
|
int main()
|
|
{
|
|
#ifdef local
|
|
freopen("pro.in","r",stdin);
|
|
#endif
|
|
res[KEndStatus]=0;
|
|
queue<LL> Q;
|
|
Q.push(KEndStatus);
|
|
while(Q.size())
|
|
{
|
|
LL u=Q.front(); Q.pop();
|
|
int distu=res[u];
|
|
int rid[9]={2,2,2,1,1,1,0,0,0};
|
|
int cid[9]={2,1,0,2,1,0,2,1,0};
|
|
int dr[4]={0,-1,0,1};
|
|
int dc[4]={-1,0,1,0};
|
|
int mpu[3][3],ur,uc;
|
|
LL utmp=u;
|
|
for(int i=0;i<9;i++)
|
|
{
|
|
mpu[rid[i]][cid[i]]=utmp%10;
|
|
utmp/=10;
|
|
if(mpu[rid[i]][cid[i]]==0)
|
|
{
|
|
ur=rid[i];
|
|
uc=cid[i];
|
|
}
|
|
}
|
|
for(int f=0;f<4;f++)
|
|
{
|
|
int vr=ur+dr[f],vc=uc+dc[f];
|
|
if(vr==-1||vr==3||vc==-1||vc==3) continue;
|
|
swap(mpu[ur][uc],mpu[vr][vc]);
|
|
LL v=0;
|
|
for(int r=0;r<3;r++)
|
|
for(int c=0;c<3;c++)
|
|
v=v*10+mpu[r][c];
|
|
if(v!=KEndStatus&&res[v]==0)
|
|
{
|
|
res[v]=distu+1;
|
|
Q.push(v);
|
|
}
|
|
swap(mpu[ur][uc],mpu[vr][vc]);
|
|
}
|
|
}
|
|
LL query;
|
|
scanf("%lld",&query);
|
|
printf("%d\n",res[query]);
|
|
return 0;
|
|
} |