hdu 5012 Dice

本文探讨了两个六面骰子通过翻转达到状态一致所需的最少步骤问题。采用BFS算法进行搜索,并利用哈希技术避免重复状态,最终实现高效求解。

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值