1. 程式人生 > >UVA 253 Cube painting(枚舉 模擬)

UVA 253 Cube painting(枚舉 模擬)

pac while names name std ret 情況 images image

題意:

按如圖的順序給定2個骰子的顏色(只有r、b、g三種顏色)

技術分享

問2個骰子是否一模一樣

技術分享

可表示為“rbgggr” 和 “rggbgr”, 第二個就是繞著Z軸順時針旋轉90度與第一個相同的骰子.

分析:

記錄一個錯誤的做法:並不是只要兩面兩面互相映射, 如rbrggb 與 rgrgbb, 即使 rb 對應 rb、gb 對應 bg、 rg對應rg, 但他們並不是一模一樣的骰子。(可以借助真正的骰子旋轉嘗試一下,就是123456 和 153426, 想象一下2與5互換, 根本不可能從原來的骰子轉出來)

正確做法是枚舉每一個面向上, 然後分別繞Z軸旋轉90度, 每個面有4種情況, 總共24種情況, 再與原來的對應匹配就好, 24個不算太多我就把表打出來了, 其實可以仔細找一下規律, 減少代碼量。

代碼:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int dir[24][6] = {{1,2,3,4,5,6},{1,4,2,5,3,6},{1,5,4,3,2,6},{1,3,5,2,4,6},{2,1,4,3,6,5},{2,3,1,6,4,5},{2,6,3,4,1,5},
 4 {2,4,6,1,3,5},{3,1,2,5,6,4},{3,5,1,6,2,4},{3,6,5,2,1,4},{3,2,6,1,5,4},{4,1,5,2,6,3},{4,6,2,5,1,3},{4,2,1,6,5,3},{4
,5,6,1,2,3}, 5 {5,1,3,4,6,2},{5,6,4,3,1,2},{5,4,1,6,3,2},{5,3,6,1,4,2},{6,2,4,3,5,1},{6,5,3,4,2,1},{6,3,2,5,4,1},{6,4,5,2,3,1}}; 6 char t[100]; 7 bool judge(int kase) 8 { 9 for(int i = 0; i < 6; i++){ 10 if(t[i] != t[dir[kase][i] + 5]) 11 return false; 12 } 13 return
true; 14 } 15 int main() 16 { 17 18 while(scanf("%s", &t) != EOF){ 19 int ok = 0; 20 for(int i = 0; i < 24; i++){ 21 if(judge(i)) ok = 1; 22 } 23 printf("%s\n", ok? "TRUE":"FALSE"); 24 } 25 return 0; 26 }

UVA 253 Cube painting(枚舉 模擬)