18714 迷宫问题

本文介绍了迷宫问题的基本概念,通常使用广度优先搜索求解,但针对特殊情况会采用深度优先搜索(DFS)。迷宫算法涉及三个关键要素:数据结构(如二维数组)、试探方向(四方向或八方向)以及防止重复访问的标志数组。通过DFS实现的C++代码示例展示了如何解决迷宫问题,并检查是否存在路径。
摘要由CSDN通过智能技术生成

(一)迷宫问题简述

迷宫问题属于搜索算法,一般情况下采用广度优先搜索,广搜不但能判断能否走出,还能求出迷宫的最短路径。
仅在一些特殊情况下才会使用DFS算法,例如行走过程中可以通过某种手段改变迷宫状态(比如有魔法棒可以拆掉一个障碍)、迷宫格子间具有某种特殊关系、走迷宫的另一个目的是为了获取分数等等。
18714 迷宫问题 属于迷宫裸题,仅用来训练基础DFS算法。


(二)迷宫算法三要素:

1、表示迷宫的数据结构
根据题目要求,一般迷宫都是用二维数组,偶见三维迷宫。读取的数据形式比较多,有些题目用*#?等符号表示迷宫,有些用数字01表示迷宫,我们在存储迷宫时,读入数据后不管原来是字符还是数字,用统一的方式存储,比如0表示可走,1表示不可走,这样熟练后可以避免细节处理错误。
2、试探方向
多为四方向,八方向。用两个偏移数组处理方向
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
这样一个循环就能得到(x,y)相邻四个点。
for(int i=0;i<4;i++)
{
        int nx=x+dx[i],ny=y+dy[i];
}
3、防止重复到达某点,避免发生死循环
设计一个标志数组,初值0。搜索过程中凡是访问过的点都标记为1,避免重复导致死循环。
 

#include <iostream>
using namespace std;
int n,m,v[105][105],ok=0;
char a[105][105];/**< 注意是字符型 */
int dx[4]= {0,0,1,-1},dy[4]= {1,-1,0,0};
void dfs(int x,int y)
{
    if(x==n&&y==m) /**< 可思考这种写法的效果 ok==1||x==n&&y==m */
    {
        ok=1;return;/**< 一旦发现可走到终点,ok为1 */
    }
    for(int i=0; i<4; i++)
    {
        int nx=x+dx[i],ny=y+dy[i];/**< 得到四个邻接点 */
        if(nx>=1&&nx<=n&&ny>=1&&ny<=m /**< 三要素:范围合法+非障碍格子+未访问过 */
                &&v[nx][ny]==0&&a[nx][ny]=='0')
        {
            v[nx][ny]=1;/**< 好的习惯是先标记 */
            dfs(nx,ny);
        }
    }
}
int main()
{
    int i,j;
    cin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            cin>>a[i][j];
    dfs(1,1);/**< 从(1,1)出发 */
    if(ok) /**< 另一种方法可以看v[n][m]是否非0,无需定义ok */
        cout<<"yes";
    else
        cout<<"no";
    return 0;
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值