week10限时模拟-东东转魔方

题目

在这里插入图片描述

分析

数组a[ ] 存放的是原魔方的情况;数组b[ ] 存放的是旋转之后魔方的情况。
1、模拟旋转的6种情况:
找到一个正方体,标上代表数字,分别模拟6中旋转的情况,将结果存放到b[ ]数组里面;
2、判断旋转之后的魔方是否成功,即判断数组b[]的六个面是否每个面数字一样。

这是一道蛮暴力的题,只要正方体叠的好,没有什么是解决不了滴。

代码

#include<stdio.h>
using namespace std;
int a[25];
//可以有6个步骤
bool pan(int *b){
	int cnt=0;
	for(int i=0;i<6;i++)
		if((b[0+4*i]==b[1+4*i])&&(b[1+4*i]==b[2+4*i])&&(b[2+4*i]==b[3+4*i]))
			cnt++;
	if(cnt==6) return true;
	return false;
}
bool tops(){
	int b[25];
	for(int i=0;i<24;i++) b[i]=a[i];
	int a1=b[4],a2=b[5];//前变成右
	b[4]=b[22];b[5]=b[20];
	b[22]=b[15];b[20]=b[14];//右变成后
	b[15]=b[17];b[14]=b[19];//后变左
	b[17]=a1;b[19]=a2;//左变前
	return pan(b);
}
bool topn(){
	int b[25];
	for(int i=0;i<24;i++) b[i]=a[i];
	int a1=b[4],a2=b[5];b[4]=b[17];b[5]=b[19];b[17]=b[15];b[19]=b[14];b[15]=b[22];b[14]=b[20];b[22]=a1;b[5]=a2;
	return pan(b);
}
bool frontn(){
	int b[25];
	for(int i=0;i<24;i++) b[i]=a[i];
	int a1=b[8],a2=b[9];b[8]=b[19];b[9]=b[18];b[19]=b[3];b[18]=b[2];b[3]=b[23];b[2]=b[22];b[23]=a1;b[22]=a2;
	return pan(b);
}
bool fronts(){
	int b[25];
	for(int i=0;i<24;i++) b[i]=a[i];
	int a1=b[8],a2=b[9];b[8]=b[23];b[23]=b[3];b[3]=b[19];b[9]=b[22];b[22]=b[2];b[2]=b[18];b[19]=a1;b[18]=a2;
	return pan(b);
}
bool lefts(){
	int b[25];
	for(int i=0;i<24;i++) b[i]=a[i];
	int a1=b[0],a2=b[2];b[0]=b[4];b[4]=b[8];b[8]=b[12];b[2]=b[6];b[6]=b[10];b[10]=b[14];b[12]=a1;b[14]=a2;
	return pan(b);
}
bool leftn(){
	int b[25];
	for(int i=0;i<24;i++) b[i]=a[i];
	int a1=b[0],a2=b[2];b[0]=b[12];b[12]=b[8];b[8]=b[4];b[2]=b[14];b[14]=b[10];b[10]=b[6];b[4]=a1;b[6]=a2;
	return pan(b);
}
int main()
{
	int N;
	scanf("%d",&N);
	while(N--){
		for(int i=0;i<24;i++)
			scanf("%d",&a[i]);
		//不移动是否可以
		if(pan(a)==true) {
			printf("YES\n");
			continue;
		}
		bool flag[12],li=false;
		flag[0]=tops();flag[1]=topn();
		flag[2]=fronts();flag[3]=frontn();
		flag[4]=lefts();flag[5]=leftn();
		for(int i=0;i<6;i++){
			if(flag[i]==true){
				li=true;
				printf("YES\n");
				break;
			}
		}
		if(li==false)
			printf("NO\n");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值