题目
信息学奥赛一本通(C++版)在线评测系统
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由的格点组成,每个格点只有种状态,.
和#
,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#
),则看成无法办到。
输入
第1行是测试数据的组数,后面跟着组输入。每组测试数据的第行是一个正整数,表示迷宫的规模是的。接下来是一个的矩阵,矩阵中的元素为.
或者#
。再接下来一行是个整数,描述A处在第行, 第列,B处在第行, 第列。注意到全部是从开始计数的。
输出
行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
输入样例
2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0
输出样例
YES
NO
思路
简单的迷宫深度优先搜索, 这里只需要判断能不能搜到即可, 不需要进行回溯。
代码
const int N = 110;
char g[N][N];
int n, m;
int stX, stY, edX, edY;
bool st[N][N];
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
bool dfs(int x, int y)
{
if (g[x][y] == '#')
return false;
if (x == edX && y == edY)
return true;
st[x][y] = true;
for (int i = 0; i < 4; i++)
{
int a = x + dx[i], b = y + dy[i];
if (a < 0 || a >= n || b < 0 || b >= n)
continue;
if (st[a][b])
continue;
if (dfs(a, b))
return true;
}
return false;
}
int main()
{
int T;
cin >> T;
while (T--)
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> g[i];
memset(st, false, sizeof st);
cin >> stX >> stY >> edX >> edY;
if (!dfs(stX, stY))
cout << "NO\n";
else
cout << "YES\n";
}
return 0;
}