直接暴搜。
#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;
}