题意:给定你一个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 ",ans); 66 67 if(ans == 0 ) 68 { 69 printf("0 "); 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 ",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 ",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 ",list[high].step); 156 printans(high); 157 break; 158 } 159 } 160 161 low ++ ; 162 } 163 printf(" "); 164 return 0 ; 165 }