/* ID: ferromr1 PROG: msquare LANG: C++ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define full ((1 << 24) - 1) #define sz 123456 ifstream fin ("msquare.in"); ofstream fout ("msquare.out"); int x, i, init, act, target, pos[10], l, r; string ret; queue > q; map v; void print (int x) { for (i = 0; i < 8; ++i) { fout << (x & 7) << " "; x >>= 3; } fout << endl; } int A (int x) { for (i = 0; i < 8; ++i) { int zero = full ^ 7, tmp = ((x >> ((7 - i) * 3)) & 7) ^ 7; x &= (zero << ((7 - i) * 3)) | ((1 << ((7 - i) * 3)) - 1); x |= tmp << ((7 - i) * 3); } return x & full; } int B (int x) { for (i = 0; i < 8; ++i) { int zero = full ^ 7, tmp = (x >> ((7 - i) * 3)) & 7; if (tmp & 4) { if (tmp == 4) tmp = 7; else --tmp; } else { if (tmp == 3) tmp = 0; else ++tmp; } x &= (zero << ((7 - i) * 3)) | ((1 << ((7 - i) * 3)) - 1); x |= tmp << ((7 - i) * 3); } return x & full; } int C (int x) { for (i = 0; i < 8; ++i) { int zero = full ^ 7, tmp = (x >> ((7 - i) * 3)) & 7; if (tmp == 1) tmp = 2; else if (tmp == 2) tmp = 5; else if (tmp == 5) tmp = 6; else if (tmp == 6) tmp = 1; x &= (zero << ((7 - i) * 3)) | ((1 << ((7 - i) * 3)) - 1); x |= tmp << ((7 - i) * 3); } return x & full; } int main () { for (i = 0; i < 8; ++i) { fin >> x; pos[x] = i; init = (init << 3) | i; } for (i = 1; i <= 8; ++i) { target = (target << 3) | pos[i]; } l = r = 0; q.push (make_pair (init, "")); while (1) { act = q.front().first; ret = q.front().second; q.pop(); if (act == target) break; if (v[act]) continue; v[act] = 1; q.push (make_pair (A(act), ret + "A")); q.push (make_pair (B(act), ret + "B")); q.push (make_pair (C(act), ret + "C")); } fout << ret.size() << endl; if (!(int)ret.size()) fout << endl; for (i = 0; i < (int)ret.size(); i += 60) fout << ret.substr (i, 60) << endl; return 0; }