HDU 5983 Pocket Cube 【模擬】
阿新 • • 發佈:2018-12-13
題意:2*2*2的魔方只轉一次,問是否能讓魔方六面都相等
思路:
用陣列記錄每個面的數字,並且從1到24編號,注意這裡要根據題目要求的輸入順序編號,能一次就完成任務的情況只有兩種,一種是六面都已經滿足條件了,第二種是存在兩個對立面相等的情況,只限兩個,多一個都不行;對立面相等的不用管,只需要轉動除對立面的另外四個面就行了,轉的方式有兩種,一種是順時針一種是逆時針;
#include <iostream> using namespace std; int a[30]; bool check (int x, int y, int xx, int yy) { if(x == y && xx == yy && x == xx) return true; else return false; } int main (void) { int N; cin >> N; while (N--) { int cnt = 0; for (int i = 1; i <= 21; i+=4) { cin >> a[i] >> a[i+1] >> a[i+2] >> a[i+3]; if(check (a[i], a[i+1], a[i+2], a[i+3])) cnt++; } if(cnt == 6) { cout << "YES" << endl; continue; } else if(cnt != 2) { cout << "NO" << endl; continue; } bool falg = false; if(check (a[1], a[2], a[3], a[4]) && check (a[9], a[10], a[11], a[12])) { if(check (a[20], a[18], a[13], a[14]) && check (a[15], a[16], a[22], a[24]) && check (a[21], a[23], a[7], a[8]) && check (a[5], a[6], a[17], a[19])) falg = true; if(check (a[19], a[17], a[15], a[16]) && check (a[13], a[14], a[21], a[23]) && check (a[22], a[24], a[5], a[6]) && check (a[7], a[8], a[18], a[20])) falg = true; } else if(check (a[17], a[18], a[19], a[20]) && check (a[21], a[22], a[23], a[24])) { if(check (a[2], a[4], a[5], a[7]) && check (a[6], a[8], a[9], a[11]) && check (a[10], a[12], a[13], a[15]) && check (a[14], a[16], a[1], a[3])) falg = true; if(check (a[1], a[3], a[6], a[8]) && check (a[5], a[7], a[10], a[12]) && check (a[9], a[11], a[14], a[16]) && check (a[13], a[15], a[2], a[4])) falg = true; } else if(check (a[5], a[6], a[7], a[8]) && check (a[13], a[14], a[15], a[16])) { if(check (a[19], a[20], a[1], a[2]) && check (a[3], a[4], a[21], a[22]) && check (a[23], a[24], a[11], a[12]) && check (a[9], a[10], a[17], a[18])) falg = true; if(check (a[17], a[18], a[3], a[4]) && check (a[1], a[2], a[23], a[24]) && check (a[21], a[22], a[9], a[10]) && check (a[11], a[12], a[19], a[20])) falg = true; } if(falg) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }