题目来源: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