首页 > 其他分享 >数据结构实验代码分享 - 4

数据结构实验代码分享 - 4

时间:2023-12-29 17:12:13浏览次数:37  
标签:arr 数据结构 curr 代码 迷宫 DFS Path 分享 size

迷宫与栈问题(图的应用)

【问题描述】

以一个 m*n 的长方阵表示迷宫,0 和 1 分别表示迷宫中的通路和障碍。设计一个程序,

对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

输入:行 列

迷宫,0表示无障碍,1表示有障碍

输出:一条Path 或 “NO PATH”

 

注:参考了《数据结构算法与应用 C++语言描述》

设计思路

这题不算难,直接应用DFS及其思想探出一条路来即可,有路就返回true,否则返回false;

自顶向下分析:

  1. 存储输入的迷宫;
  2. 找路;
  3. 有路就输出路径,没有就输出“ NO PATH! ”。

 

一些细节:

  1. DFS的两个要点在于状态记录栈 + 已访问标记List

a)       每当DFS访问到某点,即将那个点置为“障碍”,作为DFS的已访问标识

b)      状态记录栈可以用递归的系统工作栈,也可以自己写个栈

  1. 迷宫外层包一圈“障碍”,以统一迷宫内外层的操作

 

代码实现

 1 // 找到迷宫路径 (DFS + 栈)  : 下 0, 右 1, 上 2,左 3
 2 bool findPath(vector<vector<bool>> &arr, vector<position> &Path) {
 3     const position exit(arr.size() - 2, arr[0].size() - 2); // 出口
 4     position curr(1, 1);
 5     int r = curr.row, c = curr.column;   // 当前行列索引
 6     do {
 7         curr.row = r; curr.column = c; // 更新当前节点值
 8         arr[curr.row][curr.column] = true; // DFS已访问标记
 9 
10         Path.push_back(curr);
11         curr.option = -1;
12         // 此处判断是否到达出口,如果到达直接return true
13         if(IsExit(curr, exit)) {
14             return true;
15         }
16         // 没到达出口则继续移动
17         while(CouldMove(arr, curr.row, curr.column) == false) {
18             if(Path.size() == 0) {
19                 return false;   // 若栈退到栈空,则全路径再无可移动方向,即全是死路
20             } else {
21                 Path.pop_back();    // 若栈不空,则退栈,直至某位置尚有移动方向
22                 if (Path.size() > 0) {
23                     curr = Path[Path.size() - 1];   // 更新当前结点
24                 }
25             }
26         }
27         // 更新当前行列索引
28         r = curr.row;
29         c = curr.column;
30 
31         // 下一步往哪走?
32         whereToGo(arr, Path, r, c);
33 
34     } while (Path.size() != 0); // 结束条件:到达出口 或 Path栈空
35 
36     return true;
37 }

 

运行结果

 

标签:arr,数据结构,curr,代码,迷宫,DFS,Path,分享,size
From: https://www.cnblogs.com/hk416hoshi/p/17935288.html

相关文章

  • 【代码分享】10行代码写一个超级简单的进度条
    我们知道,Python使用rich或tqdm模块可以轻松创建进度条,那么如果我们自己写一个,需要几行代码呢?答案是4行。显示效果完整代码完整代码如下,核心代码也就4行#!/usr/bin/envpython#-*-coding:UTF-8-*-importtimedefprogress_bar(desc:str,index:int,total:int,b......
  • iOSapp开发怎么分享小程序?
    Hello,大家好我是咕噜铁蛋!随着移动互联网的迅猛发展,小程序作为一种新型的应用形态,已经逐渐成为移动开发领域的新宠。对于iOS开发者来说,如何将自己的APP与小程序进行无缝对接,为用户提供更加便捷的服务,成为了一个值得探讨的话题。今天铁蛋讲为大家详细解读iOS开发APP如何分享小程序。......
  • day02 代码随想录算法训练营 977. 有序数组的平方
    题目:977. 有序数组的平方我的感悟:这道题,仔细观察,平方后两头的大。用双指针,取两头,放到新的数组里。新数组要求排序所以,新的数组从后往前放理解难点:无他,多练习。代码难点:无总结概括:双指针代码示例:classSolution:defsortedSquares(self,nums:List[in......
  • Vscode 配置ssh实现用vscode直接看远程服务器代码
    1、下载vscode插件下载RemoteDevelopment插件2、配置ssh文件安装完成后,在左边有对应插件,设置config的配置文件 3、ctrl+shift+p:选择Remote-SSH,确认后选择刚才配置的文件4、此时会打开一个新的窗口,按照提示一步一步执行,一般输入密码,校验成功后会提示连接到远程,选择打开......
  • 数据结构实验代码分享 - 3
    哈夫曼编码/译码系统(树应用)[问题描述]任意给定一个仅由26个大写英文字母组成的字符序列,根据哈夫曼编码算法,求得每个字符的哈夫曼编码。要求:1)输入一个由26个英文字母组成的字符串,请给出经过哈夫曼编码后的编码序列及其编码程度。(编码)2)采用上一问题的哈夫曼编码,给定一串编......
  • 【虹科分享】利用ProfiShark 构建便携式网络取证工具包
    **文章速览:**-为什么要使用便携式网络取证工具?构建便携式网络取证套件法证分析ProfiShark1G作为便携式分路器的优点网络安全领域日益重视便携式取证工具的灵活应用。本文介绍了如何构建一个以ProfiShark1G为核心的便携式网络取证工具包,以提高网络取证的效率和实效性。一......
  • 常用代码模板自用
    导入库(用于深度学习)importosimporttimefromdatetimeimporttimedeltaimportjsonimportyamlfromtqdmimporttqdmimportnumpyasnpimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFfromtorch.utils.dataimportDataLoader 绘图(用于......
  • BUG分享|报错:Cannot access Memory (@ 0xe00fffe4, Read, Acc Size: 4 Byte);移植FreeR
    引言在移植FreeRTOS到STM32F411CEU6上时,出现了烧录一次后,无法再次烧录的情况。现象烧录时报错:CannotaccessMemory(@0xe00fffe4,Read,AccSize:4Byte);弹窗:Connectionrefusedduetodevicemismatch!单片机:STM32F411CEU6烧录器:DAPLink现象:修改代码后,第一次可以......
  • BUG分享|DMA发送数据时,会被莫名打断,或者发送乱码。
    引言在驱动ST7789屏幕时,使用了SPI+DMA进行图像刷新。在执行清屏操作时,使用配置DMA内存到外设,内存地址不变,发送的内存是一个16位的RGB565像素值变量,可以指定清屏填充的颜色。单片机:STM32F411CEU6库函数:标准库现象清屏代码如下:/*清屏函数输入参数填充矩形的左上角坐标和右下......
  • day01 代码随想录算法训练营 27. 移除元素
    题目:27.移除元素感悟:用快慢指针。本题是要原地删除。而删除这个行为在真实的计算机的数组里,是覆盖。所以,就用两个指针,(人)一个跑的快,一个跑的慢。他们身上带了个对讲机。跑的快的那个人负责检测后面的数字符合要求不,比如,要不等于3的,遇到一个2,告诉跑的慢的说2符合要求。遇......