迷宫
说明
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。
输入格式
第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n (1 <= n <= 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha, la, hb, lb全部是从0开始计数的。
输出格式
k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
样例
输入数据 1
2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0
#include <queue>
#include <cstdio>
#include <cstring>
const int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
int n, k;
char c[105][105];
bool vis[105][105];
void input(int n) {
for (int i = 0; i < n; i++, scanf("\n"))
for (int j = 0; j < n; j++)
c[i][j] = getchar();
}
bool check(int x, int y) { return x >= 0 && x < n && y >= 0 && y < n && !vis[x][y] && c[x][y]=='.'; }
bool bfs(int startx, int starty, int endx, int endy) {
std::queue<int> qx, qy;
qx.push(startx); qy.push(starty);
while (!qx.empty()) {
int fx = qx.front(), fy = qy.front();
qx.pop(); qy.pop();
vis[fx][fy] = true;
if (fx == endx && fy == endy) return true;
for (int i = 0; i < 4; i++) {
int nx = fx + dx[i], ny = fy + dy[i];
if (check(nx, ny)) qx.push(nx), qy.push(ny);
}
}
return false;
}
int main() {
scanf("%d\n", &k);
while (k--) {
scanf("%d\n", &n);
input(n);
int sx, sy, ex, ey;
scanf("%d %d %d %d\n", &sx, &sy, &ex, &ey);
memset(vis, 0, sizeof vis);
if (!check(sx, sy) || !check(ex, ey)) {
puts("NO");
} else if (bfs(sx, sy, ex, ey)) {
puts("YES");
} else {
puts("NO");
}
}
return 0;
}
TLEx6,REx14,虽然样例能过,套了洪水填充的板子,求调