/*
我的想法就是将x位置的数进行四个方向的交换
如果已经出现过这个状态,就continue,如果没有就加入到队列中,
所有状态也就是9!个,不多。每次查找x的位置,然后进行转换
和那个魔板那题很像.
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
char g[3][3];
unordered_map<string, int> dist;
void set(string s)
{
for (int i = 0, t = 0; i < 3; i ++ )
for (int j = 0; j < 3; j ++ )
g[i][j] = s[t ++ ];
// cout << g[0][0] << g[0][1] << g[0][2] << endl;
// cout << g[1] << endl;
// cout << g[2] << endl;
// for (int i = 0; i < 3; i ++ )
// {
// for (int j = 0; j < 3; j ++ )
// printf("%c", g[i][j]);
// puts("");
// }
}
string get()
{
string s;
for (int i = 0, t = 0; i < 3; i ++ )
for (int j = 0; j < 3; j ++ )
s += g[i][j];
// cout << s << endl;
return s;
}
string Up(string s, int x, int y)
{
set(s);
swap(g[x][y], g[x - 1][y]);
return get();
}
string Right(string s, int x, int y)
{
set(s);
swap(g[x][y], g[x][y + 1]);
return get();
}
string Down(string s, int x, int y)
{
set(s);
swap(g[x][y], g[x + 1][y]);
return get();
}
string Left(string s, int x, int y)
{
set(s);
swap(g[x][y], g[x][y - 1]);
return get();
}
int bfs(string start, string end)
{
if (start == end) return 0;
queue<string> q;
q.push(start);
dist[start] = 0;
// int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
while (q.size())
{
string t = q.front();
q.pop();
int x, y;
for (int i = 0; i < t.size(); i ++ )
if (t[i] == 'x') x = i / 3, y = i % 3;
//四个操作没问题,检查过了
string m[4];//四种情况,四个交换
if (x > 0) m[0] = Up(t, x, y);/
if (y < 2) m[1] = Right(t, x, y);
if (x < 2) m[2] = Down(t, x, y);
if (y > 0) m[3] = Left(t, x, y);
// puts("--------------");
// for (int i = 0; i < 4; i ++ ) cout << m[i] << endl;
// puts("[------------]");
for (int i = 0; i < 4; i ++ )
if (!dist.count(m[i]))//如果是新的状态,就更新
{
dist[m[i]] = dist[t] + 1;
q.push(m[i]);
if (m[i] == end) return dist[m[i]];
}
}
return -1;
}
int main()
{
string start, end;
end = "12345678x";
for (int i = 1; i <= 9; i ++ )
{
int c; scanf("%c ", &c);
start += c;
}
// set(start);
// get();
printf("%d\n", bfs(start, end));
// cout << s << endl;
return 0;
}