T1215:迷宫

【题目描述】

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

解题思路

  这道题,我刚开始以为需要回溯寻找目标点,最后超时了...找了找原因,其实不需要回溯,因为如果回溯的话,是可以求多少种到达目标点的方法、更新最小路径以及本题的问题,但是对于本题而言,我们只需要判断可以到达目标点即可。

例如:(S起点 E终点)

S . # .
. . . .
. . # .
E # . .

走的顺序为:(右 上 左 下)

1 2  #  9
  3 4 5
 11  10  # 6
 12  #  8 7

 

 

代码如下

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int num, n, sx, sy, ex, ey, flag;
 5 char a[110][110];
 6 bool vis[110][110];
 7 int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
 8 void dfs(int x, int y){
 9     if(x == ex && y == ey){
10         flag = 1;
11         return;
12     }
13     else{
14         for(int i = 0; i < 4; i++){
15         int tx = x + dir[i][0], ty = y + dir[i][1];
16         if(tx < 0 || tx > n - 1 || ty < 0 || ty > n - 1)    continue;
17         if(!vis[tx][ty] && a[tx][ty] == '.'){
18             vis[tx][ty] = 1;
19             dfs(tx, ty);
20             }
21         }    
22     }
23     
24 }
25 int main(){
26     cin >> num;
27     while(num--){
28         cin >> n;
29         memset(vis, 0, sizeof(vis));    //多样例  注意初始化
30         for(int i = 0; i < n; i++){
31             for(int j = 0; j < n; j++){
32                 cin >> a[i][j];
33             }
34         }
35         cin >> sx >> sy >> ex >> ey;
36         vis[sx][sy] = 1;
37         flag = 0;
38         dfs(sx, sy);
39         if(flag  == 1)        cout << "YES" << endl;
40         else    cout << "NO" << endl;
41     }
42     return 0;
43 }
迷宫

 

原文地址:https://www.cnblogs.com/zoom1109/p/11196976.html