1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <iostream> #include <algorithm> #include <cstring>
using namespace std;
const int N = 24;
int op[8][7] = { {0, 2, 6, 11, 15, 20, 22}, {1, 3, 8, 12, 17 ,21, 23}, {10, 9, 8, 7, 6, 5, 4}, {19, 18, 17, 16, 15, 14, 13}, {23, 21, 17, 12, 8, 3, 1}, {22, 20, 15, 11, 6, 2, 0}, {13, 14, 15, 16, 17, 18, 19}, {4, 5, 6, 7, 8, 9, 10}, };
int oppsite[] = {5, 4, 7, 6, 1, 0, 3, 2}; int center[] = {6, 7, 8, 11, 12, 15, 16, 17};
int n; int g[N]; int path[100];
int f() { static int sum[4]; memset(sum, 0, sizeof sum); for (int i = 0; i < 8; ++i) sum[g[center[i]]] ++; int s = 0; for (int i = 1; i <= 3; ++i) s = max(s, sum[i]); return 8 - s; }
void move(int ac) { int t = g[op[ac][0]]; for (int i = 0; i < 6; ++i) g[op[ac][i]] = g[op[ac][i + 1]]; g[op[ac][6]] = t; }
bool dfs(int u, int depth, int last) { if (u + f() > depth) return false; if (f() == 0) return true; for (int i = 0; i < 8; ++i) { if (oppsite[i] != last) { move(i); path[u] = i; if (dfs(u + 1, depth, i)) return true; move(oppsite[i]); } } return false; }
int main() { while(cin >> g[0], g[0]) { for (int i = 1; i < N; ++i) cin >> g[i]; int depth = 0; while(!dfs(0, depth, -1)) depth ++; if (!depth) cout << "No moves needed"; else { for (int i = 0; i < depth; ++i) cout << (char) (path[i] + 'A'); } cout << '\n' << g[center[0]] << '\n'; } }
|