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 }
    迷宫

     

  • 相关阅读:
    Introduction to Oracle9i: SQL left join 和 left outer join 的区别
    ORACLE10G RMAN 命令
    Oracle管理与维护.手工创建数据库以及脚本
    RMAN 备份基本用法
    ASM 常用概念解释
    oracle学习笔记之二:数据类型之DATETIME 收藏
    10g中表监控与statistics_level
    Oracle 学习笔记: RMAN常用命令
    Oracle 进程类别
    ORACLE TRUNC()函数
  • 原文地址:https://www.cnblogs.com/zoom1109/p/11196976.html
Copyright © 2011-2022 走看看