题意:给定你一个2*2的魔方,问你根据它所给的三种变换使得初始的状态,得到目标状况的最少步数。

解题思路:bfs + 状态压缩,因为8面筛子只有8!,只需要把一个组合数映射到hs数判重即可

解题代码:

  1 // File Name: msquare.c
  2 // Author: darkdream
  3 // Created Time: 2014年03月10日 星期一 21时01分14秒
  4 /*
  5 ID: dream.y1
  6 PROG: msquare
  7 LANG: C++
  8 */
  9 #include<stdio.h>
 10 #include<string.h>
 11 #include<stdlib.h>
 12 #include<time.h>
 13 #include<math.h>
 14 struct node{
 15   int a[9];
 16   char N;
 17   int step;
 18   int last;
 19 }list[50000];
 20 int hs[50000];
 21 int A[10];
 22 int hehe(int *a)
 23 {
 24     int ths[10] ;
 25     memset(ths,0,sizeof(ths));
 26     int vhs = 0 ;
 27     for(int i = 1;i <= 8 ;i ++)
 28     {
 29         int tsum =0 ; 
 30         for(int j = 1;j < a[i] ;j ++)
 31             if(!ths[j])
 32                 tsum ++ ; 
 33         vhs += (tsum * A[ 8-i ]);
 34         ths[a[i]] = 1; 
 35     }
 36     return vhs;
 37 }
 38 void printans(int p)
 39 {
 40    if(p == 1 )
 41        return;
 42    printans(list[p].last);
 43    printf("%C",list[p].N);
 44 }
 45 int main(){
 46    freopen("msquare.in","r",stdin);
 47    freopen("msquare.out","w",stdout);
 48    memset(hs,0,sizeof(hs));
 49    memset(list,0,sizeof(list));
 50    A[0] = 0; 
 51    A[1] = 1; 
 52    for(int i = 2; i <= 8 ;i ++)
 53    {
 54      A[i] = i* A[i-1];
 55    }
 56    //freopen("/home/plac/problem/input.txt","r",stdin);
 57    int temp[10];
 58 
 59    for(int i = 1;i <= 8 ;i  ++)
 60    {
 61       scanf("%d",&temp[i]) ; 
 62       list[1].a[i] = i ; 
 63    }
 64    int ans = hehe(temp);
 65    //printf("%d\n",ans);
 66    
 67    if(ans == 0 )
 68    {
 69        printf("0\n\n");
 70        return 0 ;
 71    }
 72    hs[hehe(list[1].a)] = 1;
 73    list[1].step = 0; 
 74    int low = 1, high = 1; 
 75    while(low <= high )
 76    {
 77       
 78       for(int i = 1;i <= 8;i ++)
 79           temp[i] = list[low].a[9-i];
 80 
 81       int vhs =  hehe(temp);
 82       if(!hs[vhs])
 83       {
 84          hs[vhs] = 1; 
 85          high ++ ; 
 86          list[high].step = list[low].step + 1;  
 87          for(int i = 1;i <= 8;i ++)
 88          {
 89           list[high].a[i] = temp[i];
 90          }
 91          list[high].N = 'A'; 
 92          list[high].last = low;
 93          if(vhs == ans)
 94          {
 95            printf("%d\n",list[high].step);
 96            printans(high);
 97            break;
 98          }
 99       }  // first
100       
101       temp[1] = list[low].a[4];
102       temp[8] = list[low].a[5];
103       for(int i= 2;i <= 4;i ++)
104       {
105         temp[i] = list[low].a[i-1];
106       }
107       for(int i= 5;i <= 7;i ++)
108       {
109         temp[i] = list[low].a[i+1];
110       }
111       vhs =  hehe(temp);
112       if(!hs[vhs])
113       {
114          hs[vhs] = 1; 
115          high ++ ; 
116          list[high].step = list[low].step + 1;  
117          for(int i = 1;i <= 8;i ++)
118          {
119           list[high].a[i] = temp[i];
120          }
121          list[high].N = 'B'; 
122          list[high].last = low;
123          if(vhs == ans)
124          {
125            printf("%d\n",list[high].step);
126            printans(high);
127            break;
128          }
129         
130       }  // 2 change
131      
132 
133       temp[1] = list[low].a[1];
134       temp[2] = list[low].a[7];
135       temp[3] = list[low].a[2];
136       temp[4] = list[low].a[4];
137       temp[5] = list[low].a[5];
138       temp[6] = list[low].a[3];
139       temp[7] = list[low].a[6];
140       temp[8] = list[low].a[8];
141       vhs =  hehe(temp);
142       if(!hs[vhs])
143       {
144          hs[vhs] = 1; 
145          high ++ ; 
146          list[high].step = list[low].step + 1;  
147          for(int i = 1;i <= 8;i ++)
148          {
149           list[high].a[i] = temp[i];
150          }
151          list[high].N = 'C'; 
152          list[high].last = low;
153          if(vhs == ans)
154          {
155            printf("%d\n",list[high].step);
156            printans(high);
157            break;
158          }
159       }
160    
161      low ++ ; 
162    }
163  printf("\n");   
164 return 0 ;
165 }
View Code

 

posted on 2014-03-17 21:13  dark_dream  阅读(262)  评论(0编辑  收藏  举报