国庆训练赛第二场 模拟 能否一步还原二阶魔方

http://acm.hdu.edu.cn/showproblem.php?pid=5983

两种情况

一、一开始就还原好

二、要想一步还原  一定是有两面是好的(且是对立)

上下, 左右, 前后

有两层 可以发现每层模拟一下顺逆时针 会出现重复

所以可以得出结论 一共就3* 2种情况 枚举

#include<iostream>
#include<cstdio> 
#include<cstring>
using namespace std;

bool same(int a, int b, int c, int d){
	if (a == b && a == c && a == d)
		return true;
	return false;
}


int a[7][5];
int b[7];
int main(){
	int t;
	scanf("%d", &t);
	while (t--){
		memset(b, 0, sizeof(b));
		for (int i = 1; i <= 6; ++i){
			b[i] = 1;
			for (int j = 1; j <= 4; ++j){
				scanf("%d", &a[i][j]);
				//顺便看下 这个面是不是都一个颜色 
				if (j >= 2){
					if (a[i][j] != a[i][j - 1])
						b[i] = 0;
				}
			}
		}
		int success = 0;
		//一开始就好的情况 
		if (same(a[1][1], a[1][2], a[1][3], a[1][4]) && same(a[2][1], a[2][2], a[2][3], a[2][4]) && same(a[3][1], a[3][2], a[3][3], a[3][4]) && same(a[4][1], a[4][2], a[4][3], a[4][4]) && same(a[5][1], a[5][2], a[5][3], a[5][4]) && same(a[6][1], a[6][2], a[6][3], a[6][4])) 
			success = 1;
		//转一步  一定就是有对立面 颜色相同  即上下13, 左右56, 前后24  只需转一层顺逆 就好了 不是转两次顺逆 因为重复了 
		//上下面同 
		if (b[1] && b[3] && same(a[2][1], a[2][2], a[5][3], a[5][1]) && same(a[5][4], a[5][2], a[4][1], a[4][2])&& same(a[4][3], a[4][4], a[6][4], a[6][2])&& same(a[6][3], a[6][1], a[2][3], a[2][4])) success = 1;
		if (b[1] && b[3] && same(a[2][1], a[2][2], a[6][4], a[6][2]) && same(a[6][3], a[6][1], a[4][1], a[4][2])&& same(a[4][3], a[4][4], a[5][3], a[5][1])&& same(a[5][4], a[5][2], a[2][3], a[2][4])) success = 1;
		
		//左右同	
		if (b[5] && b[6] && same(a[2][2], a[2][4], a[1][3], a[1][1]) && same(a[1][2], a[1][4], a[4][3], a[4][1])&& same(a[4][4], a[4][2], a[3][1], a[3][3])&& same(a[3][2], a[3][4], a[2][1], a[2][3])) success = 1;
		if (b[5] && b[6] && same(a[2][2], a[2][4], a[3][1], a[3][3]) && same(a[3][2], a[3][4], a[4][1], a[4][3])&& same(a[4][2], a[4][4], a[1][1], a[1][3])&& same(a[1][2], a[1][4], a[2][1], a[2][3])) success = 1;
				
		//前后同			
		if (b[2] && b[4] && same(a[1][3], a[1][4], a[5][2], a[5][1]) && same(a[5][4], a[5][3], a[3][3], a[3][4])&& same(a[3][1], a[3][2], a[6][1], a[6][2])&& same(a[6][3], a[6][4], a[1][1], a[1][2])) success = 1;
		if (b[2] && b[4] && same(a[1][3], a[1][4], a[6][1], a[6][2]) && same(a[6][3], a[6][4], a[3][3], a[3][4])&& same(a[3][1], a[3][2], a[5][2], a[5][1])&& same(a[5][3], a[5][4], a[1][1], a[1][2])) success = 1;
		
		
		if (success)
			puts("YES");
		else
			puts("NO");
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/liangnimahanwei/article/details/82933685