特殊的二階魔方
阿新 • • 發佈:2018-11-10
時限:1000ms 記憶體限制:10000K 總時限:3000ms
描述
魔方大家應該都玩過。現在有一個特殊的二階魔方,它只有一面是白色,其餘五個面全是黑色。玩這個魔方當然也有特殊的規則,玩家只能通過六種方式去改變它,底層向左轉一格(稱為DL),底層向右轉一格(稱為DR),右側向上轉一格(稱為RU),右側向下轉一格(稱為RD),內側順時針轉一格(稱為C),內側逆時針轉一格(稱為CC)。現給一魔方的狀態,請在最少的步驟內把魔方還原
輸入
按照上下左右前後的順序給出各面的具體情況,0表示白色,1表示黑色。上下、左右、前後分別是以俯檢視、左檢視、正檢視看到的
輸出
輸出令一面全為白色的最小步數。
輸入樣例
00
00
11
11
11
11
11
11
11
11
11
11
輸出樣例
0
#include<iostream> #include<queue> #include<math.h> using namespace std; int num[12],bai[4],ba[4],num3=0; queue<int>q1; queue<int>q2; queue<int>q3; queue<int>q4; void readdata(); void init(); int bfs(); int moveto(int n); int main() { int result,i,tmp=1,flag=1,sum=0; readdata(); init(); for(i=0; i<11; i=i+2) { if(num[i]==0&&num[i+1]==0) { cout<<"0"<<endl; return 0; } } result=bfs(); for(i=1; i<10; i++) { sum=sum+pow(6,i); if(sum>=result) { cout<<i<<endl; return 0; } } return 0; } void readdata() { int i; for(i=0; i<12; i++) { cin>>num[i]; } } void init() { int i,j=0; for(i=0; i<12; i++) { if(num[i]==0) { bai[j]=i*2+1; j++; bai[j]=i*2+2; j++; } if(num[i]==10) { bai[j]=i*2+2; j++; } if(num[i]==1) { bai[j]=i*2+1; j++; } } q1.push(bai[0]); q2.push(bai[1]); q3.push(bai[2]); q4.push(bai[3]); } int bfs() { int i,j,tmp=0,flag=0,bug=0,bs[24]; while(!q1.empty()) { bai[0]=q1.front(); q1.pop(); bai[1]=q2.front(); q2.pop(); bai[2]=q3.front(); q3.pop(); bai[3]=q4.front(); q4.pop(); for(i=0; i<6; i++) { ba[0]=bai[0]; ba[1]=bai[1]; ba[2]=bai[2]; ba[3]=bai[3]; num3++; moveto(i); for(j=1; j<25; j++) { bs[j]=0; } for(j=0; j<4; j++) { bs[ba[j]]=1; } for(j=1; j<22; j=j+4) { if(bs[j]==1&&bs[j+1]==1&&bs[j+2]==1&&bs[j+3]==1) { return num3; } } q1.push(ba[0]); q2.push(ba[1]); q3.push(ba[2]); q4.push(ba[3]); } } } int moveto(int n) { int i; if(n==0) { for(i=0; i<4; i++) { if(bai[i]==5) { ba[i]=6; } else if(bai[i]==6) { ba[i]=8; } else if(bai[i]==7) { ba[i]=5; } else if(bai[i]==8) { ba[i]=7; } else if(bai[i]==19) { ba[i]=11; } else if(bai[i]==20) { ba[i]=12; } else if(bai[i]==11) { ba[i]=24; } else if(bai[i]==12) { ba[i]=23; } else if(bai[i]==24) { ba[i]=16; } else if(bai[i]==23) { ba[i]=15; } else if(bai[i]==16) { ba[i]=19; } else if(bai[i]==15) { ba[i]=20; } } } if(n==1) { for(i=0; i<4; i++) { if(bai[i]==5) { ba[i]=7; } else if(bai[i]==6) { ba[i]=5; } else if(bai[i]==7) { ba[i]=8; } else if(bai[i]==8) { ba[i]=6; } else if(bai[i]==19) { ba[i]=16; } else if(bai[i]==20) { ba[i]=15; } else if(bai[i]==16) { ba[i]=24; } else if(bai[i]==15) { ba[i]=23; } else if(bai[i]==24) { ba[i]=11; } else if(bai[i]==23) { ba[i]=12; } else if(bai[i]==11) { ba[i]=19; } else if(bai[i]==12) { ba[i]=20; } } } if(n==2) { for(i=0; i<4; i++) { if(bai[i]==13) { ba[i]=15; } else if(bai[i]==14) { ba[i]=13; } else if(bai[i]==15) { ba[i]=16; } else if(bai[i]==16) { ba[i]=14; } else if(bai[i]==2) { ba[i]=24; } else if(bai[i]==4) { ba[i]=22; } else if(bai[i]==24) { ba[i]=8; } else if(bai[i]==22) { ba[i]=6; } else if(bai[i]==8) { ba[i]=18; } else if(bai[i]==6) { ba[i]=20; } else if(bai[i]==18) { ba[i]=2; } else if(bai[i]==20) { ba[i]=4; } } } if(n==3) { for(i=0; i<4; i++) { if(bai[i]==13) { ba[i]=14; } else if(bai[i]==14) { ba[i]=16; } else if(bai[i]==15) { ba[i]=13; } else if(bai[i]==16) { ba[i]=15; } else if(bai[i]==2) { ba[i]=18; } else if(bai[i]==4) { ba[i]=20; } else if(bai[i]==18) { ba[i]=8; } else if(bai[i]==20) { ba[i]=6; } else if(bai[i]==8) { ba[i]=24; } else if(bai[i]==6) { ba[i]=22; } else if(bai[i]==24) { ba[i]=2; } else if(bai[i]==22) { ba[i]=4; } } } if(n==4) { for(i=0; i<4; i++) { if(bai[i]==17) { ba[i]=18; } else if(bai[i]==18) { ba[i]=20; } else if(bai[i]==19) { ba[i]=17; } else if(bai[i]==20) { ba[i]=19; } else if(bai[i]==3) { ba[i]=14; } else if(bai[i]==4) { ba[i]=16; } else if(bai[i]==14) { ba[i]=8; } else if(bai[i]==16) { ba[i]=7; } else if(bai[i]==8) { ba[i]=12; } else if(bai[i]==7) { ba[i]=10; } else if(bai[i]==12) { ba[i]=3; } else if(bai[i]==10) { ba[i]=4; } } } if(n==5) { for(i=0; i<4; i++) { if(bai[i]==17) { ba[i]=19; } else if(bai[i]==18) { ba[i]=17; } else if(bai[i]==19) { ba[i]=20; } else if(bai[i]==20) { ba[i]=18; } else if(bai[i]==3) { ba[i]=12; } else if(bai[i]==4) { ba[i]=10; } else if(bai[i]==12) { ba[i]=8; } else if(bai[i]==10) { ba[i]=7; } else if(bai[i]==8) { ba[i]=14; } else if(bai[i]==7) { ba[i]=16; } else if(bai[i]==14) { ba[i]=3; } else if(bai[i]==16) { ba[i]=4; } } } }