参考文章:http://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5856756
The portal:http://acm.hdu.edu.cn/showproblem.php?pid=1667
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
char route[105];
bool Accord(const int * Temp) {
if(Temp[8] != Temp[7] || Temp[9] != Temp[7] || Temp[12] != Temp[7] || Temp[13] != Temp[7]
|| Temp[16] != Temp[7] || Temp[17] !=Temp[7] || Temp[18] != Temp[7]) {
return false;
}
return true;
}
int Current_max_num(const int * Temp) {
int Count_array[4];
memset(Count_array,0,sizeof(Count_array));
Count_array[Temp[ 7]] ++ ; Count_array[Temp[ 8]] ++ ; Count_array[Temp[ 9]] ++ ;
Count_array[Temp[12]] ++ ; Count_array[Temp[13]] ++ ; Count_array[Temp[16]] ++ ;
Count_array[Temp[17]] ++ ; Count_array[Temp[18]] ++ ;
int ret = Count_array[1];
if(Count_array[2] > ret) ret = Count_array[2];
if(Count_array[3] > ret) ret = Count_array[3];
return ret;
}
void Change_state(int * Temp,const int * Map,int a1,int a2,int a3,int a4,int a5,int a6,int a7) {
for(int i = 1 ; i <= 24 ; i++) {
Temp[i] = Map[i];
}
int temp_int = Temp[a1];
Temp[a1] = Temp[a2];Temp[a2] = Temp[a3];Temp[a3] = Temp[a4];
Temp[a4] = Temp[a5];Temp[a5] = Temp[a6];Temp[a6] = Temp[a7];
Temp[a7] = temp_int;
}
bool DFS(const int * Map,const int depth,const int current_depth,int pre_direction,int & res) {
if(depth - current_depth < 8 - Current_max_num(Map)) {
return false;
}
if(depth < current_depth) {
return false;
}
int Temp[30];
for(int i = 1 ; i <= 8 ; i++) {
if((i == 1 && pre_direction == 6 )||(i == 6 && pre_direction == 1))continue;
if((i == 2 && pre_direction == 5 )||(i == 5 && pre_direction == 2))continue;
if((i == 3 && pre_direction == 8 )||(i == 8 && pre_direction == 3))continue;
if((i == 4 && pre_direction == 7 )||(i == 7 && pre_direction == 4))continue;
switch( i ) {
case 1: route[current_depth] = 'A'; Change_state(Temp,Map, 1, 3, 7,12,16,21,23);break;
case 2: route[current_depth] = 'B'; Change_state(Temp,Map, 2, 4, 9,13,18,22,24);break;
case 3: route[current_depth] = 'C'; Change_state(Temp,Map,11,10, 9, 8, 7, 6, 5);break;
case 4: route[current_depth] = 'D'; Change_state(Temp,Map,20,19,18,17,16,15,14);break;
case 5: route[current_depth] = 'E'; Change_state(Temp,Map,24,22,18,13, 9, 4, 2);break;
case 6: route[current_depth] = 'F'; Change_state(Temp,Map,23,21,16,12, 7, 3, 1);break;
case 7: route[current_depth] = 'G'; Change_state(Temp,Map,14,15,16,17,18,19,20);break;
case 8: route[current_depth] = 'H'; Change_state(Temp,Map, 5, 6, 7, 8, 9,10,11);break;
}
if(Accord(Temp)) {
route[current_depth+1] = '\0';
res = Temp[7];
return true;
}
if(DFS(Temp,depth,current_depth+1,i,res)){
return true;
}
}
return false;
}
void Deal_with() {
int Map[30];
while(1) {
scanf("%d",Map+1);
if(Map[1] == 0) break;
for(int i = 2 ; i <= 24 ; i++) {
scanf("%d",Map+i);
}
if(Accord(Map)) {
puts("No moves needed");
printf("%d\n",Map[7]);
}
else {
int depth = 1;
int res;
while(1) {
if(DFS(Map,depth,0,-1,res)) {
break;
}
depth ++;
}
printf("%s\n",route);
printf("%d\n",res);
}
}
}
int main(void) {
//freopen("a.in","r",stdin);
Deal_with();
return 0;
}