7097 {
7098 array<array<char, 3>, 3> target{};
7099 array<array<char, 3>, 3> grid{};
7100 unordered_set<array<array<char, 3>, 3>, hash> us;
7101 int start_x;
7102 int start_y;
7103 for(int i = 0; i < 9; i++) {
7104 cin >> grid[i / 3][i % 3];
7105 if(grid[i / 3][i % 3] == 'x') {
7106 start_x = i / 3;
7107 start_y = i % 3;
7108 }
7109 target[i / 3][i % 3] = i + '1';
7110 }
7111 target[2][2] = 'x';
7112 queue<tuple<array<array<char, 3>, 3>, int, int, int>> q;
7113 q.push(make_tuple(grid, 0, start_x, start_y));
7114 us.insert(grid);
7115 while(!q.empty()) {
7116 auto [g, step, x, y] = q.front();
7117 q.pop();
7118 if(g == target) {
7119 cout << step;
7120 return 0;
7121 }
7122 pair<int, int> nexts[4] = {
7123 make_pair(x, y + 1),
7124 make_pair(x, y - 1),
7125 make_pair(x + 1, y),
7126 make_pair(x - 1, y)};
7127 for(auto &[nx, ny]: nexts) {
7128 if(nx >= 0 && nx < 3 && ny >= 0 && ny < 3) {
7129 swap(g[nx][ny], g[x][y]);
7130 if(!us.contains(g)) {
7131 us.insert(g);
7132 q.push(make_tuple(g, step + 1, nx, ny));
7133 }
7134 swap(g[nx][ny], g[x][y]);
7135 }
7136 }
7137 }
7138 cout << -1;
7139 return 0;
7140 }