T1. 迷宫
一天 Extense 在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n × n n \times n n×n 的格点组成,每个格点只有 2 2 2 种状态,.
和 #
,前者表示可以通行后者表示不能通行。同时当 Extense 处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense 想要从点 A A A 走到点 B B B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为 #
),则看成无法办到。
时间限制:1 s
内存限制:64 MB
- 输入
第 1 1 1 行是测试数据的组数 k k k,后面跟着 k k k 组输入。
每组测试数据的第 1 1 1 行是一个正整数 n ( 1 ≤ n ≤ 100 ) n\ (1 \le n \le 100) n (1≤n≤100),表示迷宫的规模是 n × n n \times n n×n的。
接下来是一个 n × n n \times n n×n 的矩阵,矩阵中的元素为.
或者#
。再接下来一行是 4 4 4 个整数 h a , l a , h b , l b h_a, l_a, h_b, l_b ha,la,hb,lb,描述 A A A 处在第 h a h_a ha 行,第 l a l_a la 列, B B B 处在第 h b h_b hb 行,第 l b l_b lb 列。注意到 h a , l a , h b , l b h_a, l_a, h_b, l_b ha,la,hb,lb 全部是从 0 0 0 开始计数的。 - 输出
k k k 行,每行输出对应一个输入。能办到则输出YES
,否则输出NO
。 - 样例输入
2 3 .## ..# #.. 0 0 2 2 5 ..... ###.# ..#.. ###.. ...#. 0 0 4 0
- 样例输出
YES NO
思路分析
此题考查搜索算法,属于模板题,此处不再赘述,知晓用 B F S \tt BFS BFS 效率更高即可。
/*
* Name: T1.cpp
* Problem: 迷宫
* Author: Teacher Gao.
* Date&Time: 2025/04/12 08:33
*/
#include <iostream>
#include <queue>
using namespace std;
int dx[] = {
-1, 0, 1, 0};
int dy[] = {
0, 1, 0, -1};
char a[105][105];
int n;
bool BFS(int sx, int sy, int ex, int ey) {
queue<int> Q;
bool f[105][105] = {
0};
Q.push(sx); Q.push(sy);
f[sx][sy] = 1;
while (!Q.empty()) {
int x = Q.front(); Q.pop();
int y = Q.front(); Q.pop();
if (x == ex && y == ey) return 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;