首页 > 其他分享 >数据结构--利用栈解决迷宫问题

数据结构--利用栈解决迷宫问题

时间:2024-03-26 21:30:16浏览次数:30  
标签:Point -- top 迷宫 pos int StackNode maze 数据结构

目录

一 简介

二 代码实现


一 简介

迷宫问题通常可以用深度优先搜索(DFS)或者广度优先搜索(BFS)算法解决,这两种算法都可以结合栈来实现。

二 代码实现

下面以深度优先搜索为例,演示如何使用C语言和栈来解决迷宫问题。

首先,我们需要定义迷宫和路径的状态,假设迷宫用二维数组表示,其中0代表通路,1代表墙壁。然后我们从起始点开始,每次尝试向四个方向移动(上、下、左、右),如果能移动则继续深入探索,不能移动则回退到上一个位置,直到找到出口或所有路径都被探索过。

#define WALL 1
#define PATH 0
#define VISITED 2

// 迷宫结构体定义
typedef struct {
    int rows, cols;
    int maze[10][10]; // 假设迷宫最大10x10,实际情况应根据具体迷宫大小调整
} Maze;

// 起点和终点坐标
typedef struct {
    int row, col;
} Point;

// 使用栈保存路径
typedef struct Node {
    Point pos;
    struct Node *next;
} StackNode;

// 初始化栈
void InitStack(StackNode **top) {
    *top = NULL;
}

// 入栈
void Push(StackNode **top, Point pos) {
    StackNode *newNode = (StackNode*)malloc(sizeof(StackNode));
    newNode->pos = pos;
    newNode->next = *top;
    *top = newNode;
}

// 出栈
Point Pop(StackNode **top) {
    StackNode *temp = *top;
    Point pos = temp->pos;
    *top = temp->next;
    free(temp);
    return pos;
}

// 判断栈是否为空
int IsEmpty(StackNode *top) {
    return top == NULL;
}

// 判断当前位置是否越界或为墙
int IsValid(Maze *maze, Point pos) {
    return pos.row >= 0 && pos.row < maze->rows && 
           pos.col >= 0 && pos.col < maze->cols && 
           maze->maze[pos.row][pos.col] != WALL;
}

// DFS求解迷宫
int SolveMaze(Maze *maze, Point start, Point end) {
    maze->maze[start.row][start.col] = VISITED; // 标记起点已访问
    StackNode *stackTop = NULL;
    Push(&stackTop, start);

    while (!IsEmpty(stackTop)) {
        Point current = Pop(&stackTop);
        
        // 如果到达终点,则返回成功
        if (current.row == end.row && current.col == end.col) {
            return SUCCESS;
        }

        // 尝试向四个方向移动
        for (int dir = 0; dir < 4; ++dir) {
            int newRow = current.row + directions[dir][0];
            int newCol = current.col + directions[dir][1];

            if (IsValid(maze, (Point){newRow, newCol})) {
                maze->maze[newRow][newCol] = VISITED; // 标记已访问
                Push(&stackTop, (Point){newRow, newCol}); // 把新位置压入栈
            }
        }
    }

    return FAILURE; // 所有路径都探索过了,但是没找到出口
}

// 方向数组,分别对应上(-1, 0)、下(1, 0)、左(0, -1)、右(0, 1)
int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

以上代码只是一个基础的框架,实际使用时需要填充具体的迷宫信息,并在解决问题后恢复迷宫原始状态。此外,对于更大的迷宫,建议使用递归的方式来实现DFS,这样代码会更加简洁易读。

标签:Point,--,top,迷宫,pos,int,StackNode,maze,数据结构
From: https://blog.csdn.net/m0_61635718/article/details/137048585

相关文章

  • 数据结构--栈的介绍
    目录一简介二栈的抽象数据类型(C语言实现)三栈的顺序存储结构三栈的链式存储结构一简介栈是一种线性数据结构,遵循“后进先出”(LastInFirstOut,简称LIFO)原则。在栈中,数据的插入和删除操作只允许在表的一端进行,这一端被称为栈顶。如同现实中的栈板,最后放入的元素最......
  • 13. 一起学习机器学习 PCA
    LineardimensionalityreductionThepurposeofthisnotebookistounderstandandimplementtwolineardimensionalityreductionmethods:Principlecomponentanalysis(PCA)Non-NegativeMatrixFactorization(NMF)Themainideaofthesemethodsistoappro......
  • LeetCode 11.盛最多的水(双指针,贪心)
    题目:思路:我们可以安排俩个指针(数组下标)放在数组的头部和尾部;每次移动高度较低的下标,判断是否为最大水量并记录;(水量=下标差乘较小高度)证明可行性:如果移动高度较高的下标,由于下标差减小,故不论后面下标对应的高度增大,不变或减小都会导致水量减小;(增大:下标差减小,较小高度......
  • 10. 一起学习机器学习 -- Convolutional Neural Networks (CNNs)
    ConvolutionalNeuralNetworks(CNNs)ThepurposeofthisnotebookistopracticeimplementingandtrainingCNNs.Westartwitha1-dimensionalconvolutionallayerinNumPy.WewillthenusePyTorch,anoptimisedmachinelearningframeworkforPythonbas......
  • 介绍一款非常不错的录像软件
    介绍一款非常不错的录像软件。支持很多录音格式,有AVI,MP4,MOV,TS,VOB等,你也可以自定义设置影片的FPS和比特率。如果你想长时间的录制视频,影片大小可支持4个G的超大文件录制。支持全屏幕录制,也支持自定义范围录制,你可通过调节录像框来决定录像的范围,将不想要录制的地方隐藏......
  • 3.26博客
    作业根据地域属性实现数据的可视化展示,可以看到省-市-区县三级数据下钻呈现的项目数量name为null的时候value显示为NAN因为地图该区域在数据库中没有匹配的name,所以这里count(*)直接为null,显示NAN; b->namec-<value 之前在select那里判空,没用,后来想起了地图部分在数据库......
  • 移动端 App
    移动端App概述思源笔记提供了Android端和iOS端App,已经上架部分手机应用商店,请在应用商店中搜索思源笔记​或者SiYuan​。安装和更新目前已经上架应用商店:小米华为OPPOvivo苹果酷安GooglePlayAPK下载:https://b3log.org/siyuan/download.html使用集市因......
  • 虚树
    虚树用途一棵树上进行m次不同的操作,每次用到k个节点($\sumk$$O(n)级别$)用于于树上DP原理将原树里的一部分用到的节点抠出来,建一棵新树(虚树),在上面进行DP优点:降低每次操作的复杂度构建将要用到的节点(设为s)按照dfn序排序dfn序相近的在原树上......
  • zabbix配置https访问
    1、启用ssl模块,apache2不用再去安装mod_ssl模块sudoa2enmodssl 2、创建存放证书文件的目录并赋予所有权限sudomkdir/etc/apache2/sslsudochmod777/etc/apache2/ssl 3、将证书文件上传至刚创建的目录下 4、将 /etc/apache2/sites-available/000-default......
  • 没想到三天10KStar的营销利器MediaCrawler开源作者已经删库了
    前言一站式社交平台数据抓取利器,带你玩转小红书、抖音、快手、B站和微博数据分析不经意间,来查看MediaCrawler仓库源码,发现作者已经删库了。看来是领奖了。才几天不到的时间Star数量已经直逼10K了,增长速度近乎疯狂。前两天只是将代码下载下来了,还没认真的玩。还好代码本地已经......