• 搜索练习题1215:迷宫



    题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1215


    【题目描述】

    一天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 <bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN=120;
     4 int n,xa,ya,xb,yb;
     5 bool flag;
     6 char ch;
     7 int vis[MAXN][MAXN];                    //为1表示不能通行,0表示可以通行 
     8 int dir[4][2]={-1,0,1,0,0,-1,0,1};        //控制上下左右移动 
     9 bool isp(int x,int y){
    10     return x>=0&&x<n&&y>=0&&y<n;        //判断是否在范围里面 
    11 }
    12 void dfs(int x,int y){
    13     for(int i=0;i<4;i++){
    14         int nx=x+dir[i][0];
    15         int ny=y+dir[i][1];
    16         if(isp(nx,ny)&&vis[nx][ny]==0){    //如果还没有访问过,则标记当前位置 
    17             vis[nx][ny]=1;
    18             if(nx==xb&&ny==yb){            //达到指定位置则退出 
    19                 cout<<"YES"<<endl;
    20                 flag=true;
    21                 break;
    22             } else{                        //没有到指定位置,则dfs 
    23                 dfs(nx,ny);
    24             }
    25         }
    26     }
    27 } 
    28 int main(){
    29     int  h;
    30     cin>>n;
    31     while(n--){
    32         memset(vis,0,sizeof(vis));
    33         flag=false;
    34         cin>>h;
    35         for(int i=0;i<h;i++){
    36             for(int j=0;j<h;j++){
    37                 cin>>ch;
    38                 if(ch=='#')
    39                     vis[i][j]=1;
    40             }
    41         }
    42         cin>>xa>>ya;
    43         cin>>xb>>yb;
    44         if(vis[xa][ya]||vis[xb][yb]){        //直接在起始位置和终点位置判断是否可以通过 
    45             cout<<"NO"<<endl;
    46             continue; 
    47         }else{
    48             dfs(xa,xb);
    49         }
    50         if(!flag)
    51             cout<<"NO"<<endl;                
    52     }
    53     return 0;
    54 }

    还有问题QAQ


  • 相关阅读:
    流行-Manifold学习理解与应用
    狠心奶奶自断亲情,28年后孙女拒绝相见:人有没有不原谅的权利?
    学术论文常用词汇总结(待更新)
    机动车驾驶(2)--- 老司机经验
    关于MySQL数据导出导入
    php5.6-lumen与php5.6-phalcon性能对比
    win7(64bit)+python3.5+pyinstaller3.2安装和测试
    WARNING: Can not get binary dependencies for file...
    一些不错的计算机书籍
    PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/12369524.html
Copyright © 2020-2023  润新知