题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5012

1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 5 6 4 3 1 2 3 4 5 6 1 4 2 5 3 6
0 3 -1
#include<cstdio>
#include<cmath>
#include<cstring>
#define Max 5000000
bool visit[2000000]={0};
struct Node{
int a[6],step;
}map[Max],temp,end;
int calc[6]={1,10,100,1000,10000,100000};
int hash(Node x)
{ int sum=0;
for(int i=0;i<6;i++){
sum+=x.a[i]*calc[i];
}
return sum;
}
int main(){ //六个面的编号 上0 下2 左3 右1 前4 后5
while(~scanf("%d%d%d%d%d%d",&map[0].a[0],&map[0].a[2],&map[0].a[3],&map[0].a[1],&map[0].a[4],&map[0].a[5])){
memset(visit,0,sizeof(visit));
scanf("%d%d%d%d%d%d",&end.a[0],&end.a[2],&end.a[3],&end.a[1],&end.a[4],&end.a[5]);
map[0].step=0; end.step=0;
visit[hash(end)]=1;
visit[hash(map[0])]=1;
int exdir=0,nodedir=0,flag=1;
if(hash(map[0])==hash(end)){ //完全一样,直接输出0
printf("%d\n",0);
continue;
}
while(nodedir<=exdir&&exdir<Max&&flag){
for(int i=0;i<4;i++){
temp=map[nodedir];
//向前翻转
if(!i){
int x,y;
x=temp.a[0]; temp.a[0]=temp.a[5];
y=temp.a[4]; temp.a[4]=x;
x=temp.a[2]; temp.a[2]=y;
temp.a[5]=x;
}
//向后翻转
else if(i==1){
int x=temp.a[5]; temp.a[5]=temp.a[0];
int y=temp.a[2]; temp.a[2]=x;
x=temp.a[4]; temp.a[4]=y;
temp.a[0]=x;
}
//向左翻转
else if(i==2){
int x=temp.a[3]; temp.a[3]=temp.a[0];
int y=temp.a[2]; temp.a[2]=x;
x=temp.a[1]; temp.a[1]=y;
temp.a[0]=x;
}
//向右翻转
else{
int x=temp.a[1]; temp.a[1]=temp.a[0];
int y=temp.a[2]; temp.a[2]=x;
x=temp.a[3]; temp.a[3]=y;
temp.a[0]=x;
}
temp.step++;
if(hash(temp)==hash(end)) { //达到目标,直接输出
printf("%d\n",temp.step);
flag=0;
break;
}
if(!visit[hash(temp)]) { //新节点加入队列
map[++exdir]=temp;
visit[hash(temp)]=1;
}
}
nodedir++;
}
if(flag) printf("-1\n"); //无法达到目标状态
}
return 0;
}
原文地址:http://blog.csdn.net/mummyding/article/details/39288513