1. 程式人生 > >HDU 5983 Pocket Cube 【模擬】

HDU 5983 Pocket Cube 【模擬】

題意: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;
 }