迷宫问题的深度优先法

该文章已生成可运行项目,

题目:迷宫-深度策略

一个陷入迷宫的老鼠如何找到出口的问题。老鼠希望系统性地尝试所有的路径之后走出迷宫。如果它到达一个死胡同,将原路返回到上一个位置,尝试新的路径。在每个位置上老鼠可以向八个方向运动,顺序是从正东开始按照顺时针进行。无论离出口多远,它总是按照这样的顺序尝试,当到达一个死胡同之后,老鼠将进行“回溯”。迷宫只有一个入口,一个出口,设计程序要求输出迷宫的一条通路。迷宫用二维存储结构表示,1表示障碍,0表示通路;采用回溯法设计求解通路的算法。要求如下:
1、实现栈的相关操作; 2、利用栈实现回溯算法输出路径;

输入格式: 输入包括三部分: 第一个输入是迷宫大小;第二个输入是迷宫的状态;第三个输入是入口和出口位置

输出格式: 反向输出探索的路径,注意包括入口和出口位置。每个位置之间用分号;分隔。

输入样例: 9 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1 0
0 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1
1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 7 7 输出样例: 7 7;6 6;5 7;4 6;4 5;3 4;2
5;2 4;2 3;1 2;1 1;

解题思路:
迷宫问题是数据结构中常见的一种类型,也可以当作是网格类问题的一种,对于这种问题,一般有深度优先DFS广度优先BFS方法

下面介绍用栈知识实现深度优先DFS的方法,使用栈解决需要用到栈的基本操作:

  • 的建立,初始化,入栈,出栈,栈的判空等。
  • 迷宫的数据结构:用二维数组表示迷宫结构
  • 回溯算法:使用栈实现回溯,探索迷宫所有可能的路径,遇到障碍时回溯。

下面给出程序的实现及步骤分析:

  • 首先时栈的基本操作的实现
typedef int DataType;
struct Node//栈节点类型定义
{
   
   
    DataType data;
    struct Node* next;
};

typedef struct Node* PNode;
typedef struct Node* top, * LinkStack;

//空栈创建
LinkStack SetNullStack_Link()
{
   
   
    LinkStack top = (LinkStack)malloc(sizeof(struct Node));
    if (top != NULL)
        top->next = NULL;
    else
        printf("Alloc failure");
    return top;
}

//栈判空
int IsNullStack_link(LinkStack top)
{
   
   
    if (top->next == NULL)
        return 1;
    else
    return 0;
}

//进栈函数
void Push_link(LinkStack top, DataType x)
{
   
   
    PNode p;
    p = (PNode)malloc(sizeof(struct Node));
    if (p == NULL)
        printf("Alloc failure");
    else
    {
   
   
        p->data = x;
        p->next = top->next;
        top->next = p;
    }
}

//出栈函数
void Pop_link(LinkStack top)
{
   
   
    PNode p;
    p = (PNode)malloc(sizeof(struct Node));
    if (IsNullStack_link(top))
        printf</
本文章已经生成可运行项目
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值