天神小学
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;
}