Pocket Cube UVALive - 7735结题报告

题目大意:给你一个二维魔方,只让你将一个面转动90度或者不转动,问你是否能使每个面的数字都相同。

题目链接

这是一道模拟题,模拟的方法有很多,最常用的有两种:
1、直接暴力枚举,每个面的转动情况,判断后输出结果;
2、每转动一次,便将整个魔方翻转,重新定义上下,左右,前后面。(翻转魔方和转动魔方是不一样的,前者是将魔方整个翻身,例如,翻身后,右面成了上面,左面成了下面…)

本博客采用的第一种方法,方便之处是,基本不需要什么考虑,直接列举每一种情况即可,缺点也很明显,就是代码长度十分的大,而且容易在一些小细节犯错误。
第二种方法是代码长度短,但是在将魔方翻转后的前后、左右、上下面的变换中,读入的顺序也相对变化,所以不易判断。

emm,说一下自己WA的原因:
1、本题有三种转动情况,每种又分前后两种,所以是六中,在比赛时,漏掉了一种转动情况;
2、转动魔方面,若转动后四个面相等,则相等;此前提必须是不发生转动的两个对立面相等才行;
(注意:当所有面一开始就想等时,是不需要转动魔方的。)

下面给出本题的AC代码,长度比较长,但思路还算清晰:

#include <bits/stdc++.h>

using namespace std;
const int maxn=1000;

int mf[maxn][maxn];
int above[maxn][maxn];
int side[maxn][maxn];
int top[maxn][maxn];

bool compare(int a,int b)
{
    return a==b;
}


int main()
{
    int T; scanf("%d",&T);
    while(T--)
    {
        for(int i=0;i<6;i++)
            for(int j=0;j<4;j++) scanf("%d",&mf[i][j]);

        //上面、底面
        top[0][0]=mf[0][0],top[0][1]=mf[0][1],top[0][2]=mf[0][2],top[0][3]=mf[0][3];
        top[1][0]=mf[2][0],top[1][1]=mf[2][1],top[1][2]=mf[2][2],top[1][3]=mf[2][3];
        //侧面
        side[0][0]=mf[4][0],side[0][1]=mf[4][1],side[0][2]=mf[4][2],side[0][3]=mf[4][3];
        side[1][0]=mf[5][0],side[1][1]=mf[5][1],side[1][2]=mf[5][2],side[1][3]=mf[5][3];
        //前面、后面
        above[0][0]=mf[1][0],above[0][1]=mf[1][1],above[0][2]=mf[1][2],above[0][3]=mf[1][3];
        above[1][0]=mf[3][0],above[1][1]=mf[3][1],above[1][2]=mf[3][2],above[1][3]=mf[3][3];


        bool flagt=true,flags=true,flaga=true;

        //判断对立相等的面
        for(int i=0;i<2;i++)
        {
            for(int j=1;j<4;j++)
            {
                if(top[i][j]!=top[i][0]) flagt=false;
                if(side[i][j]!=side[i][0]) flags=false;
                if(above[i][j]!=above[i][0]) flaga=false;
            }
        }

        if(flaga&&flags&&flagt) {cout<<"YES"<<endl; continue;}

        bool flag=true;

        //侧面不旋转
        if(!flaga&&!flagt&&flags)
        {

            if(compare(top[0][0],above[1][1])&&compare(top[0][2],above[1][3])&&compare(top[0][0],top[0][2])) {}
            else flag=false;

            if(compare(top[1][0],above[0][1])&&compare(top[1][2],above[0][3])&&compare(top[1][0],top[1][2])) {}
            else flag=false;

            if(compare(above[0][0],top[0][1])&&compare(above[0][2],top[0][3])&&compare(above[0][0],above[0][2])) {}
            else flag=false;

            if(compare(above[1][0],top[1][1])&&compare(above[1][2],top[1][3])&&compare(above[1][0],above[1][2])) {}
            else flag=false;

            if(flag) {cout<<"YES"<<endl;  continue;}

            flag=true;
            if(compare(top[0][0],above[0][1])&&compare(top[0][2],above[0][3])&&compare(top[0][0],top[0][2])) {}
            else flag=false;

            if(compare(top[1][0],above[1][1])&&compare(top[1][2],above[1][3])&&compare(top[1][0],top[1][2])) {}
            else flag=false;

            if(compare(above[0][0],top[1][1])&&compare(above[0][2],top[1][3])&&compare(above[0][0],above[0][2])) {}
            else flag=false;

            if(compare(above[1][0],top[0][1])&&compare(above[1][2],top[0][3])&&compare(above[1][0],above[1][2])) {}
            else flag=false;

            if(flag) {cout<<"YES"<<endl;  continue;}

        }
        else if(!flaga&&!flags&&flagt)//上下面不旋转
        {
            if(compare(above[0][1],side[1][1])&&compare(above[0][0],side[1][3])&&compare(above[0][1],above[0][0])) {}
            else flag=false;

            if(compare(above[1][2],side[0][2])&&compare(above[1][3],side[0][0])&&compare(above[1][2],above[1][3])) {}
            else flag=false;

            if(compare(side[0][3],above[0][3])&&compare(side[0][1],above[0][2])&&compare(side[0][3],side[0][1])) {}
            else flag=false;

            if(compare(side[1][0],above[1][0])&&compare(side[1][2],above[1][1])&&compare(side[1][0],side[1][2])) {}
            else flag=false;

            if(flag) {cout<<"YES"<<endl;  continue;}

            flag=true;
            if(compare(above[0][0],side[0][0])&&compare(above[0][1],side[0][2])&&compare(above[0][1],above[0][0])) {}
            else flag=false;

            if(compare(above[1][3],side[1][3])&&compare(above[1][2],side[1][1])&&compare(above[1][3],above[1][2])) {}
            else flag=false;

            if(compare(side[0][3],above[1][0])&&compare(side[0][1],above[1][1])&&compare(side[0][3],side[0][1])) {}
            else flag=false;

            if(compare(side[1][0],above[0][3])&&compare(side[1][2],above[0][2])&&compare(side[1][0],side[1][2])) {}
            else flag=false;

            if(flag) {cout<<"YES"<<endl;  continue;}
        }
        else if(!flags&&!flagt&&flaga)//前后面不旋转
        {
            if(compare(side[0][2],top[1][2])&&compare(side[0][3],top[1][3])&&compare(side[0][2],side[0][3])) {}
            else flag=false;

            if(compare(side[1][3],top[0][0])&&compare(side[1][2],top[0][1])&&compare(side[1][2],side[1][3])) {}
            else flag=false;

            if(compare(top[0][2],side[0][0])&&compare(top[0][3],side[0][1])&&compare(top[0][2],top[0][3])) {}
            else flag=false;

            if(compare(top[1][0],side[1][1])&&compare(top[1][1],side[1][0])&&compare(top[1][0],top[1][1])) {}
            else flag=false;

            if(flag) {cout<<"YES"<<endl;  continue;}

            flag=true;
            if(compare(side[0][2],top[0][0])&&compare(side[0][3],top[0][1])&&compare(side[0][2],side[0][3])) {}
            else flag=false;

            if(compare(side[1][3],top[1][2])&&compare(side[1][2],top[1][3])&&compare(side[1][2],side[1][3])) {}
            else flag=false;

            if(compare(top[0][3],side[1][0])&&compare(top[0][2],side[1][1])&&compare(top[0][2],top[0][3])) {}
            else flag=false;

            if(compare(top[1][0],side[0][1])&&compare(top[1][1],side[0][0])&&compare(top[1][0],top[1][1])) {}
            else flag=false;

            if(flag) {cout<<"YES"<<endl;  continue;}
        }

        cout<<"NO"<<endl;

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值