zoukankan      html  css  js  c++  java
  • 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 }
    迷宫

     

  • 相关阅读:
    centos8 将SSSD配置为使用LDAP并要求TLS身份验证
    Centos8 搭建 kafka2.8 .net5 简单使用kafka
    .net core 3.1 ActionFilter 拦截器 偶然 OnActionExecuting 中HttpContext.Session.Id 为空字符串 的问题
    Springboot根据不同环境加载对应的配置
    VMware Workstation12 安装 Centos8.3
    .net core json配置文件小结
    springboot mybatisplus createtime和updatetime自动填充
    .net core autofac依赖注入简洁版
    .Net Core 使用 redis 存储 session
    .Net Core 接入 RocketMQ
  • 原文地址:https://www.cnblogs.com/zoom1109/p/11196976.html
Copyright © 2011-2022 走看看