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;
}
執行結果正確(原題樣例)。