
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<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#define eps 1e-9
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=999999+10;
struct cube
{
    int a1,a2,a3,a4,a5,a6;
    int key;
}st,en,next;
queue<cube>Q;
int ans;
bool vis[maxn];
int gao(cube c)
{
    int temp=0;
    temp+=c.a1*1;
    temp+=c.a2*10;
    temp+=c.a3*100;
    temp+=c.a4*1000;
    temp+=c.a5*10000;
    temp+=c.a6*100000;
    return temp;
}
cube solve(cube c,int k)
{
    cube temp;
    if(k==1)
    {
        temp.a1=c.a4;
        temp.a2=c.a3;
        temp.a3=c.a1;
        temp.a4=c.a2;
        temp.a5=c.a5;
        temp.a6=c.a6;
    }
    else if(k==2)
    {
        temp.a1=c.a3;
        temp.a2=c.a4;
        temp.a3=c.a2;
        temp.a4=c.a1;
        temp.a5=c.a5;
        temp.a6=c.a6;
    }
    else if(k==3)
    {
        temp.a1=c.a6;
        temp.a2=c.a5;
        temp.a3=c.a3;
        temp.a4=c.a4;
        temp.a5=c.a1;
        temp.a6=c.a2;
    }
    else
    {
        temp.a1=c.a5;
        temp.a2=c.a6;
        temp.a3=c.a3;
        temp.a4=c.a4;
        temp.a5=c.a2;
        temp.a6=c.a1;
    }
    return temp;
}
int bfs()
{
    ans=gao(en);
    memset(vis,false,sizeof(vis));
    while(!Q.empty())   Q.pop();
    st.key=0;
    Q.push(st);
    int temp=gao(st);
    vis[temp]=true;
    while(!Q.empty())
    {
        cube current=Q.front();
        Q.pop();
        if(ans==gao(current))
            return current.key;
        for(int i=1;i<=4;i++)
        {
           next=solve(current,i);
           next.key=current.key+1;
           int temp=gao(next);
           if(!vis[temp])
           {
               vis[temp]=true;
               Q.push(next);
           }
        }
    }
    return -1;
}
int main()
{
    while(~scanf("%d",&st.a1))
    {
        scanf("%d%d%d%d%d",&st.a2,&st.a3,&st.a4,&st.a5,&st.a6);
        scanf("%d%d%d%d%d%d",&en.a1,&en.a2,&en.a3,&en.a4,&en.a5,&en.a6);
        printf("%d\n",bfs());
    }
    return 0;
}
原文:http://blog.csdn.net/u014303647/article/details/39272343