• 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;
    }
  • 相关阅读:
    DB2使用MERGE INTO语句实现西虹市首富的新增及更新操作
    [转]如何更换 Ubuntu 18.04 LTS 的 GDM 登录界面背景
    ubuntu18.04安装flat-remix-gnome主题
    DB2中ALTER TABLE的使用
    《MySQL必知必会》学习笔记——附录B 样例表
    《MySQL必知必会》学习笔记——附录A MySQL入门
    《MySQL必知必会》学习笔记——第1章 了解SQL
    使用Spring Boot接受HTTP GET/POST请求的一个SQL并返回结果
    查看linux目录剩余空间大小
    ETCD数据空间压缩清理
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4792603.html
Copyright © 2020-2023  润新知