#include #include #include #include using namespace std; #define o(x,y,z) x ## y ## z #define l printf #define j return #define Z typedef Z char F; Z const F G; Z void H; G *W[] = { "baac", "baac", "dffe", "dghe", "i..j" }, *t[] = { "....", "....", "....", ".aa.", ".aa." }; Z string _; Z int i; _ V; i C, T, O, R, I, Q, U, E[256]; struct B { B(B *v) : b(v) { if( v ) for(U = 0; U < 5; U++) for(Q = 0; Q < 4; Q++) A[U][Q] = v->A[U][Q]; } H c(i k, i a, i z, i u) { i y = A[a][k]; A[a][k] = A[a + u][k + z]; A[a + u][k + z] = y; } i d(i u, i v) { j (v > -1 && v < 5 && u > -1 && u < 4) ? A[v][u] : 0; } i p(i u, i v) { j E[d(u, v)]; } i q() { for(T = 0; T < 5; T++) for(C = 0; C < 4; C++) if( t[T][C] - 46 && A[T][C] - t[T][C] ) j 0; j 1; } H D() { V.clear(); for(U = 0; U < 5; U++) for(Q = 0; Q < 4; Q++) V.push_back(E[A[U][Q]]); } B *b; i A[5][4]; }; B *r, *s; queue n; set<_> m; G *e(B &v) { j v.d(C, T) - 46 ? " " : "::"; } F f(B &v) { R = C - 1; j v.d(R, I) - v.d(C, I) ? v.d(R, I) - v.d(R, T) || v.d(C, I) - v.d(C, T) ? 43 : 124 : v.d(R, T) - v.d(C, T) ? 43 : v.d(R, I) - v.d(R, T) ? 45 : *e(v); } F g(B &v) { j v.d(C - 1, T) - v.d(C, T) ? 124 : *e(v); } i h(B &v) { O = v.b ? 1 + h(*v.b) : 0; l("Move %d\n", O); for(T = 0; T < 6; T++) { I = T - 1; for(C = 0; C < 4; C++) l("%c%s", f(v), v.d(C, I) - v.d(C, T) ? "--" : e(v)); l("%c\n", f(v)); if( T < 5 ) { for(C = 0; C < 4; C++) l("%c%s", g(v), e(v)); l("%c\n", g(v)); } } j O; } H Y() { s->D(); if( m.insert(V).second ) n.push(s); else delete s; } H w(i k, i a, i z, i u, i y, i A, i v, i b) { s = new B(r); s->c(k, a, z, u); s->c(y, A, v, b); Y(); } H x(i k, i a, i z, i u) { w(k, a, z, u, 0, 0, 0, 0); } i main() { B v(0); for(T = 0; T < 5; T++) for(C = 0; C < 4; C++) v.A[T][C] = W[T][C]; E[46] = 5; for(T = 0; T < 5; T++) for(C = 0; C < 4; C++) if( !E[O = v.d(C, T)] ) E[O] = O - v.d(C + 1, T) ? O - v.d(C, T + 1) ? 1 : 2 : O - v.d(C, T + 1) ? 3 : 4; s = &v; for(Y(); !n.empty();) { r = n.front(); n.pop(); if( r->q() ) { h(*r); break; } for(T = 0; T < 5; T++) for(C = 0; C < 4; C++) if( r->d(C, T) == 46 ) { for(R = -1; R < 2; R += 2) { O = r->p(C + R, T); if( O == 1 ) x(C, T, R, 0); if( O == 3 && r->d(C + R, T) == r->d(C + R * 2, T) ) x(C, T, R * 2, 0); if( O == 5 ) { if( r->p(C + R * 2, T) == 1 ) x(C, T, R * 2, 0); if( r->p(C + R * 2, T) == 3 && r->d(C + R * 2, T) == r->d(C + R * 3, T) ) w(C, T, R * 2, 0, C + R, T, R * 2, 0); } } for(I = -1; I < 2; I += 2) { O = r->p(C, T + I); if( O == 1 ) x(C, T, 0, I); if( O == 2 && r->d(C, T + I) == r->d(C, T + I * 2) ) x(C, T, 0, I * 2); if( O == 5 ) { if( r->p(C, T + I * 2) == 1 ) x(C, T, 0, I * 2); if( r->p(C, T + I * 2) == 2 && r->d(C, T + I * 2) == r->d(C, T + I * 3) ) w(C, T, 0, I * 2, C, T + I, 0, I * 2); } } if( r->d(C + 1, T) == 46 ) for(I = -1; I < 2; I += 2) { if( r->p(C, T + I) == 3 && r->d(C, T + I) == r->d(C + 1, T + I) ) w(C, T, 0, I, C + 1, T, 0, I); if( r->p(C, T + I) == 4 && r->d(C, T + I) == r->d(C + 1, T + I) && r->d(C, T + I * 2) == r->d(C + 1, T + I * 2) && r->d(C, T + I) == r->d(C, T + I * 2) ) w(C, T, 0, I * 2, C + 1, T, 0, I * 2); if( r->p(C, T + I) == 1 ) x(C, T + I, 1, -I); if( r->p(C + 1, T + I) == 1 ) x(C + 1, T + I, -1, -I); } if( r->d(C, T + 1) == 46 ) for(R = -1; R < 2; R += 2) { if( r->p(C + R, T) == 2 && r->d(C + R, T) == r->d(C + R, T + 1) ) w(C, T, R, 0, C, T + 1, R, 0); if( r->p(C + R, T) == 4 && r->d(C + R, T) == r->d(C + R, T + 1) && r->d(C + R * 2, T) == r->d(C + R * 2, T + 1) && r->d(C + R, T) == r->d(C + R * 2, T) ) w(C, T, R * 2, 0, C, T + 1, R * 2, 0); if( r->p(C + R, T) == 1 ) x(C + R, T, -R, 1); if( r->p(C + R, T + 1) == 1 ) x(C + R, T + 1, -R, -1); } } } j 0; }