NOJ2076

天神小学

Description:
《corpse party:blood drive》中有这么一段,班长筱崎亚由美拿到六鬼门的晶石,导致了涅?的暴走,天小的崩溃,靠着幸子的力量才逃出了天小。(剧情什么的不重要)

现在我们假设没有幸子,班长需要靠自己的力量逃出天神小学。可以把天神小学看作是一个二维的迷宫,每一秒都只能从当前位置走到上下左右四个相邻的格子里,因为天小一直在崩溃,所以有很多点是无法行走的。问班长能不能在天小完全崩溃,即t秒内逃出天神小学。

Input:
第一行一个整数T,表示数据组数

每组数据第一行输入3个整数n,m,t分别表示迷宫的行数,列数,以及距离天小崩溃剩余的时间。(3≤n,m≤20,t≤100)

接下来输入n行,每行有一个长度为m的字符串。

其中字符’.’表示可以通行

字符’*’表示无法通行

字符’O’表示出口

字符’X’表示班长的起始位置

Output:
若能逃离 输出 "happy end"

否则输出 "bad end"

#include<iostream>
#include<cstring>

using namespace std;

#define PII pair<int, int>

const int N = 30;

char g[N][N], st[N][N];
PII q[N * N];
int tt = -1, hh = 0;
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int a, b, t;


int bfs(int x, int y){
    q[++ tt] = {x, y};
    st[x][y] = 1;
    while(hh <= tt){
        auto v = q[hh ++];
        int x = v.first, y = v.second;
        for(int i = 0; i < 4; i ++){
            int nx = x + dx[i], ny = y + dy[i];
            if(nx < 0 || nx >= a || ny < 0 || ny >= b || st[nx][ny]) continue;
            if(g[nx][ny] == '*') continue;
            st[nx][ny] = st[x][y] + 1;
            q[++ tt] = {nx, ny};
            if(g[nx][ny] == 'O' && st[nx][ny] - 1 <= t) return 1;
        }
    }
    return 0;
}

int main(){
    int T;
    cin >> T;
    while(T --){
        memset(st, 0, sizeof st);
        tt = -1, hh = 0;
        
        cin >> a >> b >> t;

        int sx, sy;

        for(int i = 0; i < a; i ++)
            for(int j = 0; j < b; j ++){
                cin >> g[i][j];
                if(g[i][j] == 'X')
                    sx = i, sy = j;
            }

        if(bfs(sx, sy)) puts("happy end");
        else puts("bad end");
    }

    return 0;
}
posted @ 2020-08-31 21:11  yys_c  阅读(111)  评论(0编辑  收藏  举报