ZOJ 3736 模拟魔方

题意:
      2*2*2的魔方,给你一个初始状态,和一个限定步数,问你在这么多步数条件下最多能有多少面拼好,(不是累加关系,是某一个状态的最多,最多是6);


思路:

     最多是7步,所以直接暴力搜索,第一次写,无脑写的,308行,结果超时了,sb了,哎!有从写了一下,就是找找转换规律,100多行ac,总之就是个水模拟,细心点,转换规律别写错了就行了...


#include<stdio.h>
#include<string.h>
#include<queue>

using namespace std;

typedef struct
{
   int a ,b;
}SW;

typedef struct
{
   int now[25] ,t;
}NODE;

SW sw[5][15];
NODE xin ,tou;

void csh_sw()
{
   sw[1][1].a = 4 ,sw[1][1].b = 6;
   sw[1][2].a = 5 ,sw[1][2].b = 7;
   sw[1][3].a = 6 ,sw[1][3].b = 8;
   sw[1][4].a = 7 ,sw[1][4].b = 9;
   sw[1][5].a = 8 ,sw[1][5].b = 23;
   sw[1][6].a = 9 ,sw[1][6].b = 22;
   sw[1][7].a = 23 ,sw[1][7].b = 4;
   sw[1][8].a = 22 ,sw[1][8].b = 5;
   sw[1][9].a = 1 ,sw[1][9].b = 0;
   sw[1][10].a = 3,sw[1][10].b = 1;
   sw[1][11].a = 2 ,sw[1][11].b = 3;
   sw[1][12].a = 0 ,sw[1][12].b = 2;
   
   sw[2][1].a = 1 ,sw[2][1].b = 7;
   sw[2][2].a = 3 ,sw[2][2].b = 13;
   sw[2][3].a = 7 ,sw[2][3].b = 17;
   sw[2][4].a = 13 ,sw[2][4].b = 19;
   sw[2][5].a = 17 ,sw[2][5].b = 21;
   sw[2][6].a = 19 ,sw[2][6].b = 23;
   sw[2][7].a = 21 ,sw[2][7].b = 1;
   sw[2][8].a = 23 ,sw[2][8].b = 3;
   sw[2][9].a = 9 ,sw[2][9].b = 8;
   sw[2][10].a = 15,sw[2][10].b = 9;
   sw[2][11].a = 14 ,sw[2][11].b = 15;
   sw[2][12].a = 8 ,sw[2][12].b = 14;
   
   sw[3][1].a = 2 ,sw[3][1].b = 8;
   sw[3][2].a = 3 ,sw[3][2].b = 14;
   sw[3][3].a = 8 ,sw[3][3].b = 17;
   sw[3][4].a = 14 ,sw[3][4].b = 16;
   sw[3][5].a = 17 ,sw[3][5].b = 11;
   sw[3][6].a = 16 ,sw[3][6].b = 5;
   sw[3][7].a = 11 ,sw[3][7].b = 2;
   sw[3][8].a = 5 ,sw[3][8].b = 3;
   sw[3][9].a = 6 ,sw[3][9].b = 7;
   sw[3][10].a = 7,sw[3][10].b = 13;
   sw[3][11].a = 13 ,sw[3][11].b = 12;
   sw[3][12].a = 12 ,sw[3][12].b = 6;

}

int maxx;
void jude(NODE a)
{
   int now = 0;
   if(a.now[0] == a.now[1] && a.now[1] == a.now[2] && a.now[2] == a.now[3])
   now ++;
   if(a.now[4] == a.now[5] && a.now[5] == a.now[10] && a.now[10] == a.now[11])
   now ++;
   if(a.now[6] == a.now[7] && a.now[7] == a.now[12] && a.now[12] == a.now[13])
   now ++;
   if(a.now[8] == a.now[9] && a.now[9] == a.now[14] && a.now[14] == a.now[15])
   now ++;
   if(a.now[16] == a.now[17] && a.now[17] == a.now[18] && a.now[18] == a.now[19])
   now ++;
   if(a.now[20] == a.now[21] && a.now[21] == a.now[22] && a.now[22] == a.now[23])
   now ++;
   if(maxx < now) maxx = now;
}

int T;
void bfs()
{
   queue<NODE>q;
   xin.t = 0;
   q.push(xin);
   maxx = 0;
   jude(xin);
   while(!q.empty())
   {
      tou = q.front();
      q.pop();
      jude(tou);
      if(maxx == 6) return;
      if(tou.t == T) continue;
      
      for(int i = 1 ;i <= 3 ;i ++)
      {
         xin = tou ,xin.t ++;
         for(int j = 1 ;j <= 12 ;j ++)
         xin.now[sw[i][j].a] = tou.now[sw[i][j].b];
         q.push(xin);
      }
      
      for(int i = 1 ;i <= 3 ;i ++)
      {
         xin = tou ,xin.t ++;
         for(int j = 1 ;j <= 12 ;j ++)
         xin.now[sw[i][j].b] = tou.now[sw[i][j].a];
         q.push(xin);
      }
   }
}

int main ()
{
   int i;
   csh_sw();
   while(~scanf("%d" ,&T))
   {
      maxx = 0;
      for(i = 0 ;i <= 23 ;i ++)
      scanf("%d" ,&xin.now[i]);
      bfs();
      printf("%d
" ,maxx);
   }
   return 0;
}
      
      
      

原文地址:https://www.cnblogs.com/csnd/p/12063261.html