hdu 5012 Dice(西安网络赛F题,BFS)

BFS+记忆化搜索。。

网赛的时候,竟然一开始没发现这道水题。后来TYQ做的时候用了很久去判断一开始就是INF的情况,其实就这道题的数据而言,根本不需要。。。

后来在hdu上交的时候,限制搜索步长为3,竟然都AC了。。。

不过,就是这么水的数据,我一开始误打的DFS竟然WA了!!

代码先注释了,等哪天空了来对拍一下 = = Orz。。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <limits>

using namespace std;

#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define F(i, n) for (int (i)=0;(i)<(n);++(i))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))
#define MEM0(addr, size) memset(addr, 0, size)
#define LBIT(x) x&-x

#define PI 3.1415926535897932384626433832795
#define HALF_PI 1.5707963267948966192313216916398

#define MAXN 100
#define MAXM 10000
#define MOD 10000007

typedef long long LL;

const double maxdouble = numeric_limits<double>::max();
const double eps = 1e-10;
const int INF = 0x7FFFFFFF;

#define DEBUG

map<int, int> _map;
int buf[MAXN];
int ans = INF;

struct Dice{
    int top;
    int bot;
    int lef;
    int rig;
    int fro;
    int bac;
    bool read_in() {
        return scanf("%d %d %d %d %d %d",&top, &bot, &lef, &rig, &fro, &bac) != EOF;
    }
    int make_num() {
        int ret = top;
        ret = ret*10 + bot;
        ret = ret*10 + lef;
        ret = ret*10 + rig;
        ret = ret*10 + fro;
        ret = ret*10 + bac;
        return ret;
    }
    bool operator == (Dice & b) {
        return top == b.top && bot == b.bot && lef == b.lef && rig == b.rig
            && fro == b.fro && bac == b.bac;
    }
};

Dice A, B;
int cnt[4];

Dice left_rotation(const Dice & d) {
    Dice ret = d;
    int tmp = ret.top;
    ret.top = ret.rig;
    ret.rig = ret.bot;
    ret.bot = ret.lef;
    ret.lef = tmp;
    return ret;
}

Dice right_rotation(const Dice & d) {
    Dice ret = d;
    int tmp = ret.top;
    ret.top = ret.lef;
    ret.lef = ret.bot;
    ret.bot = ret.rig;
    ret.rig = tmp;
    return ret;
}

Dice front_rotation(const Dice & d) {
    Dice ret = d;
    int tmp = ret.top;
    ret.top = ret.bac;
    ret.bac = ret.bot;
    ret.bot = ret.fro;
    ret.fro = tmp;
    return ret;
}

Dice back_rotation(const Dice & d) {
    Dice ret = d;
    int tmp = ret.top;
    ret.top = ret.fro;
    ret.fro = ret.bot;
    ret.bot = ret.bac;
    ret.bac = tmp;
    return ret;
}
/*
int dfs(Dice & d, int step) {
    if (d == A) {
        ans = min(ans, step);
        return 0;
    }
    Dice tmp;
    int now = d.make_num(), num, val = INF;
    if (_map.find(now) != _map.end())
        return _map[now];
    // left
    if (cnt[0] < 4) {
            tmp = left_rotation(d);
            num = tmp.make_num();
            if (_map.find(num) != _map.end()) {
                int n = _map[num];
                if (n != INF)
                    val = min(val, n);
            } else {
                ++cnt[0];
                val = min(val, dfs(tmp, step+1));
                --cnt[0];
            }
    }
    // right
    if (cnt[1] < 4) {
            tmp = right_rotation(d);
            num = tmp.make_num();
            if (_map.find(num) != _map.end()) {
                int n = _map[num];
                if (n != INF)
                    val = min(val, n);
            } else {
                ++cnt[1];
                val = min(val, dfs(tmp, step+1));
                --cnt[1];
            }
    }
    // front
    if (cnt[2] < 4) {
            tmp = front_rotation(d);
            num = tmp.make_num();
            if (_map.find(num) != _map.end()) {
                int n = _map[num];
                if (n != INF)
                    val = min(val, n);
            } else {
                ++cnt[2];
                val = min(val, dfs(tmp, step+1));
                --cnt[2];
            }
    }
    // bottom
    if (cnt[3] < 4) {
            tmp = back_rotation(d);
            num = tmp.make_num();
            if (_map.find(num) != _map.end()) {
                int n = _map[num];
                if (n != INF)
                    val = min(val, n);
            } else {
                ++cnt[3];
                val = min(val, dfs(tmp, step+1));
                --cnt[3];
            }
    }

    if (val == INF)
        _map[now] = INF;
    else {
        _map[now] = val+1;
        ans = min(ans, step+val+1);
    }
    return _map[now];
}*/

int main() {
    freopen("input.in", "r", stdin);

    while(A.read_in() && B.read_in()) {
        ans = INF;
        _map.clear();
         queue<Dice> q;
        //memset(cnt, 0, sizeof(cnt));
        //dfs(B, 0);
        q.push(B);
        _map[B.make_num()] = 0;

        while(q.empty() == false) {
            Dice fr = q.front();q.pop();
            int num = fr.make_num();
            int step = _map[num];
            if (fr == A) {
                ans = min(ans, step);
                break;
            }
            //cout << "front: " << num << " step: " << step <<  endl;
            if (step > 9)
                continue;
            Dice t;
            // left
            t = left_rotation(fr);
            num = t.make_num();
            if (_map.find(num) == _map.end()) {
                q.push(t);_map[num] = step+1;
            }

            // right
            t = right_rotation(fr);
            num = t.make_num();
            if (_map.find(num) == _map.end()) {
                q.push(t);_map[num] = step+1;
            }
            // front
            t = front_rotation(fr);
            num = t.make_num();
            if (_map.find(num) == _map.end()) {
                q.push(t);_map[t.make_num()] = step+1;
            }
            // back
            t = back_rotation(fr);
            num = t.make_num();
            if (_map.find(num) == _map.end()) {
                q.push(t);_map[t.make_num()] = step+1;
            }
        }

        if (ans == INF)
            printf("-1\n");
        else
            printf("%d\n", ans);
    }

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值