特殊的二阶魔方

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

猜你喜欢

转载自blog.csdn.net/zhao2018/article/details/83120063