No.4 Cube painting (骰子涂色)

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;
}



运行结果正确(原题样例)。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页