1. 程式人生 > >Pocket Cube UVALive

Pocket Cube UVALive

題目大意:給你一個二維魔方,只讓你將一個面轉動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;
}