2790:迷宫,考点:递归边界

原题:http://bailian.openjudge.cn/practice/2790/

相似题:红与黑

描述

一天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”。

样例输入

2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0

样例输出

YES
NO

解法

思路:整体和红黑树相似,只是加了一步目标位置的判断

另一种思路:染色,从起点出发把能经过的都染色,最后判断目标位置是否染色,这就跟红黑树完全相同。

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 char matrix[100][100];
 5 int n;
 6 bool canreach(int x, int y,int targetx,int targety) 
 7 {
 8     if (x < 0 || x >= n || y < 0 || y >= n)
 9         return false;
10     if (matrix[x][y] == '#')
11         return false;
12     if (x == targetx && y == targety)
13         return true;
14     matrix[x][y] = '#';
15     return canreach(x + 1, y, targetx, targety) || canreach(x - 1, y, targetx, targety) ||
16         canreach(x, y + 1, targetx, targety) || canreach(x, y - 1, targetx, targety);
17 }
18 int main()
19 {
20     int k;
21     cin >> k;
22     while (k--)
23     {
24         memset(matrix, 0, sizeof(matrix));
25         cin >> n;
26         for(int i=0;i<n;i++)
27             for (int j = 0; j < n; j++)
28                 cin >> matrix[i][j];
29         int beginx, beginy, targetx, targety;
30         cin >> beginx >> beginy >> targetx >> targety;
31         if (canreach(beginx, beginy, targetx, targety))
32             cout << "YES" << endl;
33         else
34             cout << "NO" << endl;
35     }
36     return 0;
37 }

 

posted @ 2021-07-03 16:08  永远是个小孩子  阅读(66)  评论(0编辑  收藏  举报