【数据结构与算法】迷宫求解------回溯法
创作时间:
作者:
@小白创作中心
【数据结构与算法】迷宫求解------回溯法
引用
CSDN
1.
https://m.blog.csdn.net/qq_74047911/article/details/140951648
回溯法是一种通过尝试解决子问题来解决问题的算法策略。当在某一步无法继续前进时,算法会回退到上一步,尝试其他可能的解决方案。本文将通过一个迷宫求解的例子,详细介绍回溯法的实现过程。
回溯法
一.迷宫求解算法
当我们想要找到迷宫的出口,那我们在计算机中,然后操作,可以将每个位置都人栈,然后进行上下左右的路的判断,能否通过,若是死路,就将这个点出栈,回退到刚刚的栈,再判断其他的道路.
这中栈的回退就是回溯法.
二.二维数组表示地图
1.地图
1表示通路,0表示死路.
地图的结构就是一个二维数组,初始化就是进行赋值.
2.地图的打印
就是二维数组的打印.
三.进入迷宫
假设这个位置就是我们的入口.
四.栈的实现
#pragma once
#include <iostream>
using namespace std;
#define MAXSIZE 128
typedef struct ArrayPosition
{
int a;
int b;
}ArrayPosition;
typedef ArrayPosition DataType;
typedef struct Stack
{
DataType* base;
DataType* top;
}Stack;
bool initStack(Stack& S)
{
S.base = new DataType[MAXSIZE];
if (!S.base)return false;
S.top = S.base;
return true;
}
bool PushStack(Stack& S, DataType data)
{
if (S.top - S.base == MAXSIZE)return false;
*(S.top++) = data;
return true;
}
bool PopStack(Stack& S, DataType& data)
{
if (S.top == S.base)return false;
data = *(--S.top);
return true;
}
DataType* getElem(Stack& S)
{
if (S.top != S.base)
{
return (S.top - 1);
}
}
bool isEmpty(Stack& S)
{
if (S.top == S.base)
{
return true;
}
else
{
return false;
}
}
这里和我们原来讲的栈都一样,只不过数据变成了二维数组的位置.
初始化栈就可以进入到我们的迷宫判断了.
五.迷宫内探
1.首先判断我们的入口
有效的入口是在边界且为通路.
2.入栈做标记
就当前入口点入栈,然后做标记改为2,就是我们走过的地方.
3.开始探险
while (!isEmpty(*s))
{

cur = *getElem(*s);
if (isValidExit(m, cur, enter))

{
return 1;
}
//向左
next = cur;
next.b = cur.b - 1;
if (isValidNext(m, cur, next))
{
PushStack(*s, next);
m->map[next.a][next.b] = m->map[cur.a][cur.b] + 1;
continue;
}
//向上
next = cur;
next.a = cur.a-1;
if (isValidNext(m, cur, next))
{
PushStack(*s, next);
m->map[next.a][next.b] = m->map[cur.a][cur.b] + 1;
continue;
}
//向右
next = cur;
next.b = cur.b + 1;
if (isValidNext(m, cur, next))
{
PushStack(*s, next);
m->map[next.a][next.b] = m->map[cur.a][cur.b] + 1;
continue;
}
//向下
next = cur;
next.a = cur.a + 1;
if (isValidNext(m, cur, next))
{
PushStack(*s, next);
m->map[next.a][next.b] = m->map[cur.a][cur.b] + 1;
continue;
}
DataType temp;
PopStack(*s, temp);
}
return 0;
}
只有我们的栈不为空或者找不到出口,那么就一直找.
所以我们先判断是不是出口
4.出口判断
在边界但不是入口点.
然后对当前上下左右的进行判断能否下一步.
5.能否下一步
在同行同列且相邻且在二维数组范围内,值为1就是通道就可以下一步.
6.做标记
能下一步就做标记,入栈.
7.不能下一步
就出栈,进行判断上一个路口,是否可以其他的下一步.
六.运行结果
热门推荐
广东梅州:打造“客家绿茶之都”,2027年茶产业产值将破400亿
养生最好的方式:反着人性干
中国首个国家公园汤旺河:石林、红松林最佳游览攻略
伊春三大景区迎新年:鹿苑首开,九峰山滑雪,汤旺河赏冰
科技摇篮与历史警钟:哈尔滨两大地标深度游
9个花海拍照姿势,浪漫唯美又梦幻,轻松拍出自由感与生命力!
5种花漂亮便宜又好养,花开不停,多到数不清,养一株阳台变花园
香砂六君丸禁忌症与注意事项
“AI技术背景下跨学科学习创新实践”主题交流会成功举办
趣考无纸笔 快乐大闯关
乌鲁木齐市一、二年级学生迎来"无纸化"期末考试
西安藤信学校开展学科趣味活动,助力学生快乐学习
2025年1月:北京上演国际芭蕾盛宴,曼谷举办环保主题艺术展
“滑雪+洗浴”成沈阳新宠,洗浴中心变身度假胜地
元旦拔河比赛组织全攻略:从方案制定到趣味创新
沈阳首届沐浴休闲消费季开幕,打造“中国沐浴休闲之都”
沈阳洗浴消费规模居全国首位,创新服务成年轻人社交新选择
桂附理中丸真假辨别攻略:教你轻松识别正品
冬季养生必备:福东海桂附理中丸怎么吃?
唐代文学家令狐楚:诗文双绝,清廉传世
公房承租人变更全攻略:5项材料+3步流程,一次性完成手续
一文详解公租房承租人变更:6项材料+5步流程
从创新到盈利:AI自习室如何以科技为笔绘制教育新蓝图
最新研究:肝癌预后与肿瘤大小密切相关
肝肿瘤患者最佳营养方案揭秘
樊嘉院士:肝癌高危人群应每半年筛查一次
如何在社交媒体上与老同学保持联系
性格类型:如何单独领导和支持员工
日元暴跌,人民币强势崛起!
冬季汽车冷却系统保养指南:6步确保三菱发动机安全过冬