hdu 5012 Dice

来源:互联网 发布:网络摄像头有ip地址吗 编辑:程序博客网 时间:2024/06/05 07:05

        题意:有两个六面的骰子,上面写着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;}


0 0
原创粉丝点击