hdu 5012 Dice

        题意:有两个六面的骰子,上面写着1~6。每一步只能向左,右,前,后滚,问最少需要滚几次才能使两个骰子六面完全相同。

        思路:BFS。简单写个哈希判重,很轻松就搜过了。


#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>

using namespace std;

struct node{
    int val[6];
};

node s,t;

node L(node& n){
    node re;
    re.val[4]=n.val[4]; re.val[5]=n.val[5];
    re.val[0]=n.val[3]; re.val[3]=n.val[1];
    re.val[1]=n.val[2]; re.val[2]=n.val[0];
    return re;
}

node R(node& n){
    node re;
    re.val[4]=n.val[4]; re.val[5]=n.val[5];
    re.val[3]=n.val[0]; re.val[1]=n.val[3];
    re.val[2]=n.val[1]; re.val[0]=n.val[2];
    return re;
}

node F(node& n){
    node re;
    re.val[2]=n.val[2]; re.val[3]=n.val[3];
    re.val[0]=n.val[5]; re.val[5]=n.val[1];
    re.val[1]=n.val[4]; re.val[4]=n.val[0];
    return re;
}

node B(node& n){
    node re;
    re.val[2]=n.val[2]; re.val[3]=n.val[3];
    re.val[5]=n.val[0]; re.val[1]=n.val[5];
    re.val[4]=n.val[1]; re.val[0]=n.val[4];
    return re;
}

int n2i(node& n){
    int re=0;
    for(int i=0;i<6;i++){
        re*=7;
        re+=n.val[i];
    }
    return re;
}

int dis[120000];

int main(){

    while(cin>>s.val[0]>>s.val[1]>>s.val[2]>>s.val[3]>>s.val[4]>>s.val[5]){
        memset(dis,-1,sizeof(dis));
        for(int i=0;i<6;i++){
            cin>>t.val[i];
        }
        int ss=n2i(s);
        int tt=n2i(t);
        queue<node> que; que.push(s);
        dis[ss]=0;

        int ans=-1;
        while(!que.empty()){
            node cur=que.front();    que.pop();
            node nd;
            if(n2i(cur)==tt){
                ans=dis[n2i(cur)];
                break;
            }

            nd=L(cur);
            if(-1==dis[n2i(nd)]){
                dis[n2i(nd)]=dis[n2i(cur)]+1;
                que.push(nd);
            }

            nd=R(cur);
            if(-1==dis[n2i(nd)]){
                dis[n2i(nd)]=dis[n2i(cur)]+1;
                que.push(nd);
            }

            nd=F(cur);
            if(-1==dis[n2i(nd)]){
                dis[n2i(nd)]=dis[n2i(cur)]+1;
                que.push(nd);
            }

            nd=B(cur);
            if(-1==dis[n2i(nd)]){
                dis[n2i(nd)]=dis[n2i(cur)]+1;
                que.push(nd);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}


你可能感兴趣的:(bfs,2014西安网赛)