Files
SH-Quizzes/ACMOJ-1998.cpp
2023-12-23 22:23:48 +08:00

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;
}