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;
}

 

posted @ 2019-12-25 11:22  shuitiangong  阅读(291)  评论(0编辑  收藏  举报