#include #include #include #include #include using std::priority_queue; using std::set; #define ABS(x) ((x) < 0 ? -(x) : (x)) const int dst = 123456780; const int S = 362880; const int frac[9] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320}; int perm2no(int p) { char perm[10]; sprintf(perm, "%09d", p); bool used[9] = {}; int n = 0; for (int i = 0; i < 9; i++) { for (int j = perm[i] - '1'; 0 <= j; j--) { if (used[j]) continue; n += frac[8 - i]; } used[perm[i] - '0'] = true; } return n; } int no2perm(int n) { char perm[10]; bool used[9] = {}; for (int i = 0; i < 9; i++) { int j = n / frac[8 - i]; n %= frac[8 - i]; for (int k = 0; k < 9; k++) { if (used[k]) continue; if (j-- == 0) { used[k] = true; perm[i] = k + '0'; break; } } } return atoi(perm); } int next_state(int p, char m) { char perm[10]; sprintf(perm, "%09d", p); int i = 0; while (perm[i] != '0') i++; switch (m) { case 'u': if (i < 3) return -1; perm[i] = perm[i - 3]; perm[i - 3] = '0'; return atoi(perm); case 'd': if (8 < i + 3) return -1; perm[i] = perm[i + 3]; perm[i + 3] = '0'; return atoi(perm); case 'l': if (i % 3 == 0) return -1; perm[i] = perm[i - 1]; perm[i - 1] = '0'; return atoi(perm); case 'r': if ((i + 1) % 3 == 0) return -1; perm[i] = perm[i + 1]; perm[i + 1] = '0'; return atoi(perm); } return -1; } struct Node { int s; int p; int f; int g; int h; char m; Node(int s = 0, int p = 0, int f = 0, int g = 0, int h = 0, char m = 0) : s(s), p(p), f(f), g(g), h(h), m(m) {} bool operator<(const Node &that) const { return that.f < this->f; } } queue[S]; int head; char moves[] = "udlr"; char res[S + 1]; int eval_g(int s) { int res = 0; for (int i = 8; 0 <= i; i--) { int c = s % 10; if (c != 0) { int x = (c - 1) / 3; int y = (c - 1) % 3; int cx = i / 3; int cy = i % 3; res += ABS(cx - x) + ABS(cy - y); } s /= 10; } return res; } bool a_star(int s, int t) { head = 0; queue[head] = Node(s, -1); priority_queue pq; pq.push(queue[head]); set used; used.insert(s); while (pq.size()) { Node &cur = queue[head]; head++; } } int main() { char perm[10]; for (int i = 0; i < 9; i++) { scanf("%s", &perm[i]); if (perm[i] == 'x') perm[i] = '0'; } int src = atoi(perm); if (a_star(src, dst)) { int pos = head, i = 0; do { res[i++] = queue[pos].m; pos = queue[pos].p; } while (pos != -1); for (int j = i - 1; 0 <= j; j--) printf("%c", res[j]); printf("\n"); } else { printf("unsolvable\n"); } return 0; }