#include <iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct A { int f[7]; int ct; }a,b; bool vis[7][7][7][7][7]; void makeflag(A &a) { vis[a.f[1]][a.f[2]][a.f[3]][a.f[4]][a.f[5]]=1; } void left(A &p) { p.f[1]=a.f[4]; p.f[2]=a.f[3]; p.f[3]=a.f[1]; p.f[4]=a.f[2]; p.f[5]=a.f[5]; p.f[6]=a.f[6]; } void right(A &p) { p.f[1]=a.f[3]; p.f[2]=a.f[4]; p.f[3]=a.f[2]; p.f[4]=a.f[1]; p.f[5]=a.f[5]; p.f[6]=a.f[6]; } void Front(A &p) { p.f[1]=a.f[6]; p.f[2]=a.f[5]; p.f[3]=a.f[3]; p.f[4]=a.f[4]; p.f[5]=a.f[1]; p.f[6]=a.f[2]; } void Back(A &p) { p.f[1]=a.f[5]; p.f[2]=a.f[6]; p.f[3]=a.f[3]; p.f[4]=a.f[4]; p.f[5]=a.f[2]; p.f[6]=a.f[1]; } bool check() { int i; for(i=1;i<=6;i++) if(a.f[i]!=b.f[i]) return 0; return 1; } int bfs() { memset(vis,0,sizeof(vis)); queue<A>q; a.ct=0; q.push(a); makeflag(a); while(!q.empty()){ a=q.front(); q.pop(); if(check()){ return a.ct; } A tmp; left(tmp); if(!vis[tmp.f[1]][tmp.f[2]][tmp.f[3]][tmp.f[4]][tmp.f[5]]){ vis[tmp.f[1]][tmp.f[2]][tmp.f[3]][tmp.f[4]][tmp.f[5]]=1; tmp.ct=a.ct+1; q.push(tmp); } right(tmp); if(!vis[tmp.f[1]][tmp.f[2]][tmp.f[3]][tmp.f[4]][tmp.f[5]]){ vis[tmp.f[1]][tmp.f[2]][tmp.f[3]][tmp.f[4]][tmp.f[5]]=1; tmp.ct=a.ct+1; q.push(tmp); } Front(tmp); if(!vis[tmp.f[1]][tmp.f[2]][tmp.f[3]][tmp.f[4]][tmp.f[5]]){ vis[tmp.f[1]][tmp.f[2]][tmp.f[3]][tmp.f[4]][tmp.f[5]]=1; tmp.ct=a.ct+1; q.push(tmp); } Back(tmp); if(!vis[tmp.f[1]][tmp.f[2]][tmp.f[3]][tmp.f[4]][tmp.f[5]]){ vis[tmp.f[1]][tmp.f[2]][tmp.f[3]][tmp.f[4]][tmp.f[5]]=1; tmp.ct=a.ct+1; q.push(tmp); } } return -1; } int main() { while(~scanf("%d",&a.f[1])){ int i; for(i=2;i<=6;i++) scanf("%d",&a.f[i]); for(i=1;i<=6;i++) scanf("%d",&b.f[i]); printf("%d\n",bfs()); } return 0; } |
Double click to view unformatted code.