2020-09-27

Crius__發表於2020-09-27

No.4 Cube painting (骰子塗色)

題目就不貼上了,注意變化的次數,不要總是改變。(另註明:原題中一次性輸入12個顏色改為了分兩次輸入顏色)

程式碼:

#include<iostream>
#include<string>
using namespace std;

void swap(char& a, char &b) {  //交換顏色位置
	char temp;
	temp = a;
	a = b;
	b = temp;
}

void top(int x, int y, char b[6]) {
	char temp;
	swap(b[x], b[0]);
	swap(b[y], b[5]);
	if (x*y == 0) {
		swap(b[3], b[4]);          //改為可以挨著的位置(旋轉可以改變)                      
	}
	else if (x*y == 4) {
		swap(b[3], b[4]);                                   
	}
	else if (x*y == 6) {
		swap(b[1], b[2]);
	}
}

void turnover(char b[6]) {
	swap(b[0], b[5]);
	swap(b[2], b[3]);               //把骰子翻轉過來
}

bool cmp(char a[6], char b[6]) {    //比較除上下面以外的面
	char * temp;
	temp = new char[4];
	for (int i = 0; i < 4; i++) {
		temp[i] = b[i + 1];
	}
	int sum = 0;
	for (int i0 = 0; i0 < 4; i0++) {
		for (int j = 1, i = 0; j <= 4&&i<4; j++,i++) {
				if (temp[(i0+i) % 4] == a[j]) {
					sum++;
				}
				if (sum == 4) {
					return 1;
				}
		}
					sum = 0;
	}
	return 0;
}
bool compare(char a[6], char b[6]) {
	char*c = new char[6];
	strcpy(c , b);
	for (int i = 0;i<6; i++) {
		if (a[0] == b[i] && a[5] == b[5 - i]) {
			if (i > 2) {
				turnover(b);
				top(5-i,i,b);  //之前改變多了,應當只變一次
				cout << cmp(a, b)<<endl;
				//比較中間是否相等即可!
				if (cmp(a, b)) {
					return 1;
				}
				strcpy(b, c);  //上條註釋的修正
			}
			else {
				top(i, 5 - i, b);//之前改變多了,應當只變一次
				cout << cmp(a, b) << endl;
				if (cmp(a, b)) {
					return 1;
				}
				strcpy(b, c);
			}
		}
	}
	return 0;
}

int main() {
	char str1[7] = { 0 };
	char str2[7] = { 0 };
	while (cin >> str1 >> str2) {
		if (compare(str1, str2)) {
			cout << "一樣" << endl;
		}
		else {
			cout << "不一樣" << endl;
		}
	}
	return 0;
}



執行結果正確(原題樣例)。