UVA253 骰子涂色 Cube painting 题解

题意翻译

输入两个骰子,判断二者是否等价。每个骰子用6个字母表示。如第一幅图所示。

例如rbgggr和rggbgr分别表示下面两幅图的两个骰子。两者是等价的,因为图1中所示的骰子沿着竖直轴旋转90°之后就可以得到图2所示的骰子。

输入格式:

12个字母,前6个字母是第一个骰子的六个面;后6个字母是第二个骰子的六个面。

输出格式:

一个布尔值。若两个骰子是等价的,则输出TRUE;反之输出FALSE。

输入输出样例

输入 #1

rbgggrrggbgr
rrrbbbrrbbbr
rbgrbgrrrrrg

输出 #1

TRUE
FALSE
FALSE

思路

思路1:判断两个骰子的3组面是否能一一对应.这个思路可以得到AC代码但是不符合题目要求,如rgbgrbgrgrbb.

思路2:暴力模拟一遍骰子所有旋转后的可能.

代码

思路1

#include <stdio.h>
#include <string.h>
#define maxn 15
struct cube {
	char A;
	char B;
};
cube left[10];
cube right[10];
char str[maxn];
int main() {
	#ifdef LOCAL
		freopen("253.out", "w+", stdout);
	#endif
	while (scanf("%s", str) != EOF) {
		for (int i = 0; i < 3; i++) {
			left[i].A = str[i];
			left[i].B = str[5 - i];
			right[i].A = str[6 + i];
			right[i].B = str[11 - i];
		}
		int flag;
		int i;
		for (i = 0; i < 3; i++) {
			if ((left[i].A == right[i].A && left[i].B == right[i].B)) {
				continue;
			}
			flag = 0;
			for (int j = i ; j < 3; j++) {
				if ((left[i].A == right[j].A && left[i].B == right[j].B) || (left[i].B == right[j].A && left[i].A == right[j].B)) {
					flag = 1;
					right[j].A = right[i].B;
					right[j].B = right[i].A;
					right[i] = left[i];
					break;
				}
			}
			if (flag) {
				continue;
			} else {
				printf("FALSE\n");
				break;
			}
		}
		int x = 1;
		if (i == 3) {
			for (int m = 0; m < 3; m++) {
				if (left[m].A != right[m].A || left[m].B!= right[m].B) {
					printf("FALSE\n");
					x = 0;
					break;
				}
			}
			if (x == 1) {
				printf("TRUE\n");			
			}
		}
	}
	return 0;
}

思路2

#include <stdio.h>
#include <string.h>
#define maxn 15   
// 注意面的对应关系
int list[6][6] ={{0,1,2,3,4,5},{1,0,3,2,5,4},{2,0,1,4,5,3},{3,0,4,1,5,2},{4,0,2,3,5,1},{5,1,3,2,4,0}};
char left[maxn];
char right[maxn];
char str[maxn];
int vaild() {
	for (int i = 0; i < 6; i++) {
		char test[10] ="";
		for (int j = 0; j < 6; j++) {
			test[j] = left[list[i][j]];
		}
		test[6] = '\0';
		for (int k = 0; k < 4; k++) {
			char temp = test[1];
			test[1] = test[2];
			test[2] = test[4];
			test[4] = test[3];
			test[3] = temp;
			if (strcmp(test, right) == 0) {
				return 1;
			}			
		}
	}
	return 0;
}
int main() {
	#ifdef LOCAL
		freopen("253.out", "w+", stdout);
	#endif	
	while (scanf("%s", str) != EOF) {
		for (int i = 0; i < 6; i++) {
			left[i] =str[i];
		}
		for (int i = 6; i < 12; i++) {
			right[i - 6] = str[i];
		}
		if (vaild()) {
			printf("TRUE\n");
		} else {
			printf("FALSE\n");
		}
	}
	return 0;
}
上一篇:支持minio cubestore docker 镜像


下一篇:POJ-1988-Cube Stacking