UVA1343 The Rotation Game旋轉游戲
阿新 • • 發佈:2018-11-20
題目:如題,棋盤上由數字1,2,3組成,往A,B,C,D,E,F,G,H8個方向旋轉棋盤,使得中間8個數相等,最多有幾步。
分析:這題關鍵在於最大深度的判斷,有幾個不等數字,就說明至少還需要移動幾次,還有一個關鍵地方就是對映,將8個方向的旋轉對映到一維陣列。
00 01
02 03
04 05 06 07 08 09 10
11 12
13 14 15 16 17 18 19
20 21
22 23
A:0, 2, 6,11,15,20,22
B:1, 3, 8,12,17,21,23
C:10, 9, 8, 7, 6, 5, 4
D:19,18,17,16,15,14,13
E就等於B的反方向,下面同理。
#include<cstdio> #include<cstring> #include<cctype> #include<queue> #include<iostream> #include<vector> #include<list> using namespace std; /* 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 */ int line[4][7] = { { 0, 2, 6,11,15,20,22}, // A { 1, 3, 8,12,17,21,23}, // B {10, 9, 8, 7, 6, 5, 4}, // C {19,18,17,16,15,14,13}// D }; int center[8] = { 6,7,8,11,12,15,16,17 }; int mp[24]; char ans[10000]; bool isfinal() { for (int i = 1; i < 8; i++) { if (mp[center[i]] != mp[center[0]]) { return false; } } return true; } void move(int k) { if (k < 4) { int temp = mp[line[k][0]]; for (int i = 0; i < 6; i++)mp[line[k][i]] = mp[line[k][i + 1]]; mp[line[k][6]] = temp; } else { if (k % 2==0)k -= 3; else k -= 5; int temp = mp[line[k][6]]; for (int i = 6; i > 0; i--)mp[line[k][i]] = mp[line[k][i - 1]]; mp[line[k][0]] = temp; } } int diff(int t) { int ans = 0; for (int i = 0; i < 8; i++) { if (mp[center[i]] != t)ans++; } return ans; } int h() { return min(min(diff(1), diff(2)), diff(3)); } int dfs(int dep,int maxd) { if (isfinal()) { for (int i = 0; i < dep; i++)cout << ans[i]; cout << endl; return true; } //最大深度判斷 if (dep + h() > maxd)return false; for (int i = 0; i < 8; i++) { ans[dep] = 'A' + i; move(i); if (dfs(dep + 1, maxd))return true; int k = 0; if (i < 4)if (i % 2 == 0)k = i + 5; else k = i + 3; else { if (i % 2 == 0)k = i - 3; else k = i - 5; } move(k);//還原 } return false; } int main() { while (cin >> mp[0] && mp[0]) { for (int i = 1; i < 24; i++)cin >> mp[i]; for (int i = 0; i < 24; i++)if (!mp[i])return 0; if(isfinal()) { printf("No moves needed\n"); } else { for (int maxd = 1; ; maxd++) if (dfs(0, maxd)) break; } printf("%d\n", mp[6]); } //system("pause"); return 0; }