#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007
using namespace std;
inline int read() {
rint x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0){putchar('-');x=-x;}
if(x>9){print(x/10);putchar(x%10+'0');}
else putchar(x+'0');
return;
}
const int N = 15;
const int dx[N] = {0,1,-1,0};
const int dy[N] = {1,0,0,-1};
const int st[N][N] = {
{0,0,0,0},
{0,1,2,3},
{0,8,0,4},
{0,7,6,5},
};
char s[N];
int a[N][N], sx, sy, maxdep, f;
int F() {
int cnt = 0;
For(i,1,3) For(j,1,3) cnt += (st[i][j] != a[i][j]);
return cnt;
}
bool check(int x, int y) {
if(x < 1 || x > 3 || y < 1 || y > 3) return 0;
return 1;
}
void A_star(int x, int y, int dep, int pre) {
if(f) return ;
if(dep == maxdep) {
if(!F()) f = 1;
return ;
}
For(i,0,3) {
int nx = x + dx[i], ny = y + dy[i];
if(!check(nx, ny) || pre + i == 3) continue;
swap(a[x][y], a[nx][ny]);
int exp = F();
if(exp + dep <= maxdep) A_star(nx, ny, dep + 1, i);
swap(a[x][y], a[nx][ny]);
}
}
signed main() {
scanf("%s", s + 1);
For(i,1,3) {
For(j,1,3) {
a[i][j] = s[(i-1)*3+j] - '0';
if(a[i][j] == 0) sx = i, sy = j;
}
}
if(!F()) puts("0");
for (maxdep = 1; ; maxdep++) {
A_star(sx, sy, 0, -1);
if(f) {
cout << maxdep << '\n';
break;
}
}
return 0;
}
第三十一个点总是过不去,求调!!