zoukankan      html  css  js  c++  java
  • bzoj 1054 移动玩具

    题目连接

    http://www.lydsy.com/JudgeOnline/problem.php?id=1054  

    移动玩具

    Description

    在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态。

    Input

    前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。

    Output

    一个整数,所需要的最少移动次数。

    Sample Input

    1111
    0000
    1110
    0010

    1010
    0101
    1010
    0101

    Sample Output

    4

    数据很小直接暴搜。。

    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<map>
    using std::min;
    using std::sort;
    using std::pair;
    using std::swap;
    using std::vector;
    using std::multimap;
    #define pb(e) push_back(e)
    #define sz(c) (int)(c).size()
    #define mp(a, b) make_pair(a, b)
    #define all(c) (c).begin(), (c).end()
    #define iter(c) __typeof((c).begin())
    #define cls(arr, val) memset(arr, val, sizeof(arr))
    #define cpresent(c, e) (find(all(c), (e)) != (c).end())
    #define rep(i, n) for(int i = 0; i < (int)n; i++)
    #define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)
    const int N = 1000000;
    const int INF = 0x3f3f3f3f;
    bool vis[N];
    struct Node {
        int s;
        bool mat[4][4];
    }que[N], end;
    const int dx[] = { 0, 0, -1, 1 }, dy[] = { -1, 1, 0, 0 };
    inline int hash(Node &x) {
        int ret = 0, k = 1;
        rep(i, 4) {
            rep(j, 4) {
                ret += k * x.mat[i][j];
                k <<= 1;
            }
        }
        return (ret + N) % N;
    }
    inline void read(Node &x) {
        char buf[10];
        rep(i, 4) {
            scanf("%s", buf);
            rep(j, 4) {
                x.mat[i][j] = buf[j] - '0';
            }
        }
    }
    void bfs() {
        int lb = 0, ub = 0, ret, ans;
        ret = hash(que[0]), ans = hash(end);
        if(ret == ans) { puts("0"); return; }
        ub++, cls(vis, false), vis[ret] = true;
        while(lb != ub) {
            Node &x = que[lb++];
            ret = hash(x);
            if(ret == ans) { printf("%d
    ", x.s); return; }
            rep(i, 4) {
                rep(j, 4) {
                    if(!x.mat[i][j]) continue;
                    rep(k, 4) {
                        int nx = dx[k] + i, ny = dy[k] + j;
                        if(nx < 0 || nx >= 4 || ny < 0 || ny >= 4) continue;
                        if(x.mat[nx][ny]) continue;
                        Node &t = que[ub];
                        t = x, t.s = x.s + 1;
                        swap(t.mat[i][j], t.mat[nx][ny]);
                        ret = hash(t);
                        if(vis[ret]) continue;
                        vis[ret] = true;
                        ub++;
                    }
                }
            }
        }
        puts("0");
    }
    int main() {
    #ifdef LOCAL
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w+", stdout);
    #endif
        read(que[0]), read(end);
        bfs();
        return 0;
    }
  • 相关阅读:
    一月5日
    使用Jenkins部署SpringBoot
    SpringBoot +Jpa +Thymeleaf 增删改查示例
    SpringBoot 整合 Shiro ——登录认证和权限管理
    SpringBoot 小技巧
    SpringBoot 如何测试打包部署
    SpringBoot 中MongDB的使用
    定时任务
    RabbitMQ详解
    Mybatis多数据源最简单解决方案
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4792603.html
Copyright © 2011-2022 走看看