跟八数码相似的一题搜索题。做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可。
代码如下:
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 #include <map> 6 #include <stack> 7 #include <string> 8 9 using namespace std; 10 11 char q[44444][10], op[44444], tmp[10]; 12 int qh, qt, last[44444]; 13 map<string, int> pos; 14 15 void op1(char *s) { reverse(s, s + 8);} 16 17 void op2(char *s, bool op) { 18 if (op) { 19 rotate(s, s + 3, s + 4); 20 rotate(s + 4, s + 5, s + 8); 21 } else { 22 rotate(s, s + 1, s + 4); 23 rotate(s + 4, s + 7, s + 8); 24 } 25 } 26 27 void op3(char *s, bool op) { 28 char t; 29 if (op) { 30 t = s[1]; 31 s[1] = s[6]; 32 s[6] = s[5]; 33 s[5] = s[2]; 34 s[2] = t; 35 } else { 36 t = s[1]; 37 s[1] = s[2]; 38 s[2] = s[5]; 39 s[5] = s[6]; 40 s[6] = t; 41 } 42 } 43 44 void PRE() { 45 for (int i = 0; i < 8; i++) tmp[i] = i + '0'; 46 tmp[8] = 0; 47 pos.clear(); 48 qh = qt = 0; 49 50 strcpy(q[qt], tmp); 51 pos[tmp] = qt; 52 last[qt] = -1; 53 op[qt++] = 0; 54 while (qh < qt) { 55 strcpy(tmp, q[qh]); 56 op1(tmp); 57 if (pos.find(tmp) == pos.end()) { 58 strcpy(q[qt], tmp); 59 pos[tmp] = qt; 60 last[qt] = qh; 61 op[qt++] = 'A'; 62 } 63 64 strcpy(tmp, q[qh]); 65 op2(tmp, true); 66 if (pos.find(tmp) == pos.end()) { 67 strcpy(q[qt], tmp); 68 pos[tmp] = qt; 69 last[qt] = qh; 70 op[qt++] = 'B'; 71 } 72 73 strcpy(tmp, q[qh]); 74 op3(tmp, true); 75 if (pos.find(tmp) == pos.end()) { 76 strcpy(q[qt], tmp); 77 pos[tmp] = qt; 78 last[qt] = qh; 79 op[qt++] = 'C'; 80 } 81 82 qh++; 83 } 84 } 85 86 int main() { 87 // freopen("in", "r", stdin); 88 PRE(); 89 char bg[10], ed[10], con[10]; 90 while (cin >> bg >> ed) { 91 for (int i = 0; i < 8; i++) { 92 int t = 0; 93 while (bg[i] != ed[t]) t++; 94 con[t] = i + '0'; 95 } 96 con[8] = 0; 97 int cur = pos[con]; 98 stack<char> path; 99 while (!path.empty()) path.pop(); 100 while (cur) { 101 path.push(op[cur]); 102 cur = last[cur]; 103 } 104 while (!path.empty()) { 105 putchar(path.top()); 106 path.pop(); 107 } 108 puts(""); 109 } 110 return 0; 111 }
——written by Lyon