[迷宫]——深度优先/广度优先搜索

简介: 笔记

描述:


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

思路:


这个题目可以运用深度优先搜索和广度优先搜索去运算。


深度优先搜索时从起点开始搜索,每搜索一个点后应标记一下,当碰到数组越界以及无法行走的点之后应返回上一级,最后通过判断终点是否被标记即可。


广度优先搜索时也是从起点开始出发,每当经过岔路口(即是:可以往多方向行走的路口时)要一分为多,分别走,当某一条路无法行通的时候,就只需保留其点,去进行其他点的判断即可。在广度优先搜索时,我们需要建立一个队列,去存放点,并且当存放下一路口点时,上一点要删除,最终返回的条件则是判断队列中是否为空即可。


代码:

BFS:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std ;
char a[100][100] ;
int sx, sy, ex, ey, n , t;
bool vis[100][100] ;
struct node {
  int x, y ;
  node(int xx=0, int yy=0)
  {
    x = xx ;
    y = yy ;
  }
};
int dx[] = {0,0,-1,1} ;
int dy[] = {-1,1,0,0} ;
void bfs()
{
  queue<node> q ;
  vis[sx][sy] = true ;
  q.push(node(sx,sy)) ;
  while(!q.empty())
  {
    node f = q.front() ;
    q.pop() ;
    for(int i=0; i<4; i++)
    {
      node tmp ;
      tmp.x = f.x + dx[i] ;
      tmp.y = f.y + dy[i] ;
      if(tmp.x>=0 && tmp.x<n && tmp.y>=0 &&tmp.y<n)
        if(a[tmp.x][tmp.y] == '.')
          if(vis[tmp.x][tmp.y] == false)
          {
            vis[tmp.x][tmp.y] = true ;
            q.push(tmp) ;
          }
    }
  }
}
int main()
{
  cin >> t ;
  while(t--)
  {
    cin >> n ;
    for(int i=0; i<n; i++)
    {
      for(int j=0; j<n; j++)
      {
        cin >> a[i][j] ;
      }
    }
    cin >> sx >> sy >> ex >> ey ;
    memset(vis, false, sizeof(vis)) ;
    if(a[sx][sy] == '#' || a[ex][ey] == '#')
      cout << "NO" << endl ;
    else
    {
      bfs() ;
      if(vis[ex][ey] == true)   cout << "YES" << endl ;
      else  cout << "NO" << endl ;
    }
  }
  return 0 ;
}


DFS:

#include <iostream>
#include <cstring> 
using namespace std ;
char a[110][110] ;
bool f[110][110] ;
int sx, sy, ex, ey, n ,k ;
void dfs(int x, int y)
{
  f[x][y] = true ;
  if(x==ex && y==ey)  return ;
  if(x+1<n && f[x+1][y]==false && a[x+1][y]=='.')
    dfs(x+1, y) ;
  if(x-1>=0 && f[x-1][y]==false && a[x+1][y]=='.')
    dfs(x-1, y) ;
  if(y+1<n && f[x][y+1]==false && a[x+1][y]=='.')
    dfs(x, y+1) ;
  if(y-1>=0 && f[x][y-1]==false && a[x+1][y]=='.')
    dfs(x, y-1) ;
}
int main()
{
  cin >> k ;
  while(k--)
  {
    memset(f, false, sizeof(f) ) ;
    cin >> n ;
    for(int i=0; i<n; i++)
    {
      for(int j=0; j<n; j++)
      {
        cin >> a[i][j] ;
      }
    }
    cin >> sx >> sy >> ex >> ey ;
    if(a[sx][sy] == '#' || a[ex][ey] == '#')
    {
      cout << "NO" << endl ;
    }
    else
    {
      dfs(sx, sy) ;
      if(f[ex][ey] == true) cout<<"YES" << endl ;
      else  
        cout << "NO" << endl ;
    }
  }
  return 0 ;
 } 


相关文章
|
人工智能 资源调度 算法
AI 绘画Stable Diffusion 研究(八)sd采样方法详解
AI 绘画Stable Diffusion 研究(八)sd采样方法详解
2753 0
|
存储 消息中间件 安全
构建便捷高效的宠物医疗预约服务平台:基于Spring Boot的实现
构建便捷高效的宠物医疗预约服务平台:基于Spring Boot的实现
构建便捷高效的宠物医疗预约服务平台:基于Spring Boot的实现
|
canal SQL 缓存
初识Canal以及使用Docker安装配置
初识Canal以及使用Docker安装配置
初识Canal以及使用Docker安装配置
|
8月前
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
|
8月前
|
算法 安全 Java
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
250 0
|
存储 算法 Java
【DFS(深度优先搜索)详解】看这一篇就够啦
本文介绍了深度优先搜索(DFS)算法及其应用。DFS从某个顶点出发,深入探索图的每条路径,直到无法前进为止,然后回溯。文章详细解释了DFS的基本思想,并通过示例图展示了其执行过程。此外,文中还探讨了三种枚举方式:指数型枚举、排列型枚举和组合型枚举,并提供了具体的代码实现。最后,文章通过几道练习题帮助读者更好地理解和应用DFS算法。
9479 19
【DFS(深度优先搜索)详解】看这一篇就够啦
|
人工智能 缓存 运维
AI开发辅助,开启研发新时代
AI开发辅助,开启研发新时代
429 0
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
1388 0
|
消息中间件 存储 缓存
面试官问我:如何设计一个秒杀场景?
在之前的工作经历中,我做过营销相关项目,接触过关于票券秒杀的高并发场景,秒杀场景也算是最热门的高并发场景之一了。 下面我就把我对秒杀场景的一些理解简单写下来,仅供大家参考,欢迎留言纠错或者补充。
880 0
面试官问我:如何设计一个秒杀场景?
|
算法 NoSQL 容器
状态定义与深度优先搜索、广度优先搜索
状态定义与深度优先搜索、广度优先搜索