1. 程式人生 > >特殊的二階魔方

特殊的二階魔方

時限: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;
    }
   } 
  } 
 }