一、AcWing 1112. 迷宫
【题目描述】
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由
n
∗
n
n∗n
n∗n的格点组成,每个格点只有
2
2
2种状态,.
和#
,前者表示可以通行后者表示不能通行。
同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点
A
A
A走到点
B
B
B,问在不走出迷宫的情况下能不能办到。
如果起点或者终点有一个不能通行(为#
),则看成无法办到。
注意:
A
,
B
A,B
A,B不一定是两个不同的点。
【输入格式】
第1行是测试数据的组数
k
k
k,后面跟着
k
k
k组输入。
每组测试数据的第
1
1
1行是一个正整数
n
n
n,表示迷宫的规模是
n
∗
n
n∗n
n∗n的。
接下来是一个
n
∗
n
n∗n
n∗n的矩阵,矩阵中的元素为.
或者#
。
再接下来一行是
4
4
4个整数
x
1
,
y
1
,
x
2
,
y
2
x_1,y_1,x_2,y_2
x1,y1,x2,y2,描述
A
A
A处在第
x
1
x_1
x1行, 第
y
1
y_1
y1列,
B
B
B处在第
x
2
x_2
x2行, 第
y
2
y_2
y2列。
注意到
x
1
,
y
1
,
x
2
,
y
2
x_1,y_1,x_2,y_2
x1,y1,x2,y2全部是从
0
0
0开始计数的。
【输出格式】
k
k
k行,每行输出对应一个输入。
能办到则输出YES
,否则输出NO
。
【数据范围】
1
≤
n
≤
100
1≤n≤100
1≤n≤100
【输入样例】
2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0
【输出样例】
YES
NO
【分析】
很简单的题目,当不需要求解最短距离时使用DFS求出起点与终点是否连通即可,注意本题的坑点为起点也可能是#
,因此将判断条件放在DFS的开头部分比较好。
【代码】
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
char g[N][N];
int x1, y1, x2, y2;
int n, k;
bool st[N][N];
int dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, 1, 0, -1 };
bool dfs(int x, int y)
{
if (g[x][y] == '#' || x < 0 || x >= n || y < 0 || y >= n || st[x][y]) return false;
if (x == x2 && y == y2) return true;
st[x][y] = true;
for (int i = 0; i < 4; i++)
if (dfs(x + dx[i], y + dy[i])) return true;
return false;
}
int main()
{
cin >> k;
while (k--)
{
cin >> n;
for (int i = 0; i < n; i++) cin >> g[i];
memset(st, false, sizeof st);
cin >> x1 >> y1 >> x2 >> y2;
if (dfs(x1, y1)) puts("YES");
else puts("NO");
}
return 0;
}