Pocket Cube UVALive - 7735結題報告
阿新 • • 發佈:2018-11-21
題目大意:給你一個二維魔方,只讓你將一個面轉動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; }