zoukankan      html  css  js  c++  java
  • zzulioj 2616: 推箱子(模拟)

    题目链接:http://acm.zzuli.edu.cn/problem.php?id=2616

    #include<set>
    #include<map>
    #include<stack>
    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cctype>
    #include<string>
    #include<vector>
    #include<climits>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define max(a, b) (a > b ? a : b)
    #define min(a, b) (a < b ? a : b)
    #define mst(a) memset(a, 0, sizeof(a))
    #define _test printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> P;
    const double eps = 1e-7;
    const int INF = 0x3f3f3f3f;
    const ll ll_INF = 233333333333333;
    const int maxn = 1e3+10;
    char _map[maxn][maxn];
    struct pp{
        int a, b;
    }point, Case[maxn];
    int m, n, kase;
    void input() {
        kase = 0;
        scanf("%d%d", &n, &m);
        getchar();
        for(int i=0;i<n;i++)
            scanf("%s",_map[i]);
        for (int i = 0; i<n; ++i)
            for (int j = 0; j<m; ++j) {
                if (_map[i][j] == 'V')
                    point.a = i, point.b = j;
                else if (_map[i][j] == '+') {//存入终点信息 并把+改成E简化判断
                    Case[kase].a = i, Case[kase].b = j;
                    ++kase;
                    _map[i][j] = 'E';
                }
            }
    }
    void checker() { //检查读入数据处理情况
        _test;
        for (int i = 0; i<n; ++i)
            for (int j = 0; j<m; ++j)
                printf(j == m-1 ? "%c\n" : "%c", _map[i][j]);
    }
    void checker2(){ //检查终点信息存入情况
        _test;
        for (int i = 0; i<kase; ++i)
            printf("%d %d\n", Case[i].a, Case[i].b);
    }
    void move() {
        char od[maxn];
        scanf("%s%*c", od);
        int len = strlen(od);
        for (int i = 0; i<len; ++i) {
            if (od[i] == 'U' && point.a-1 > 0 && _map[point.a-1][point.b] != '#') { //先判断移动的位置会不会越界
                if (_map[point.a-1][point.b] == 'E') { //判断上方是否为空地
                    swap(_map[point.a-1][point.b], _map[point.a][point.b]);
                    --point.a;
                }
                else if (_map[point.a-1][point.b] == 'B' && point.a-2 > 0 && _map[point.a-2][point.b] == 'E') { //判断上方是否为箱子&&箱子能不能移动
                    swap(_map[point.a-2][point.b], _map[point.a-1][point.b]);
                    swap(_map[point.a-1][point.b], _map[point.a][point.b]);
                    --point.a;
                }
            }
            else if (od[i] == 'D' && point.a+1 < n-1 && _map[point.a+1][point.b] != '#') { //同上
                if (_map[point.a+1][point.b] == 'E') {
                    swap(_map[point.a+1][point.b], _map[point.a][point.b]);
                    ++point.a;
                }
                else if (_map[point.a+1][point.b] == 'B' && point.a+2 < n-1 && _map[point.a+2][point.b] == 'E') { //下方
                    swap(_map[point.a+2][point.b], _map[point.a+1][point.b]);
                    swap(_map[point.a+1][point.b], _map[point.a][point.b]);
                    ++point.a;
                }
            }
            else if (od[i] == 'L' && point.b-1 > 0 && _map[point.a][point.b-1] != '#') { //同上
                if (_map[point.a][point.b-1] == 'E') {
                    swap(_map[point.a][point.b-1], _map[point.a][point.b]);
                    --point.b;
                }
                else if (_map[point.a][point.b-1] == 'B' && point.b-2 > 0 && _map[point.a][point.b-2] == 'E') { //左边
                    swap(_map[point.a][point.b-2], _map[point.a][point.b-1]);
                    swap(_map[point.a][point.b-1], _map[point.a][point.b]);
                    --point.b;
                }
            }
            else if (od[i] == 'R' && point.b+1 < m-1 && _map[point.a][point.b+1] != '#') { //同上
                if (_map[point.a][point.b+1] == 'E') {
                    swap(_map[point.a][point.b+1], _map[point.a][point.b]);
                    ++point.b;
                }
                else if (_map[point.a][point.b+1] == 'B' && point.b+2 < m-1 && _map[point.a][point.b+2] == 'E') { //右边
                    swap(_map[point.a][point.b+2], _map[point.a][point.b+1]);
                    swap(_map[point.a][point.b+1], _map[point.a][point.b]);
                    ++point.b;
                }
            }
            //checker(); 调试
            //checker2(); 同上
        }
    }
    bool ok() {
        for(int i = 0; i<kase; ++i)
            if (_map[Case[i].a][Case[i].b] != 'B') //检查每个终点
                return false;
        return true;
    }
    int main(void) {
        int t;
        scanf("%d%*c", &t);
        while(t--) {
            input();
            move();
            printf(ok() ? "Legendary\n" : "Loser\n");
        }
        return 0;
    }
  • 相关阅读:
    Java线程池之ThreadPoolExecutor
    React Native开发环境的搭建
    Android Lint——内嵌于Android Studio的代码优化工具
    Android异步处理技术
    NavigationView的头部的事件监听
    进程间通信之AIDL
    跨进程通信之Messenger
    Android 进程增加存活率
    android MVP模式思考
    Vim学习
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/12095687.html
Copyright © 2011-2022 走看看