回溯法:算法思路以及相关流程图的绘制
回溯法介绍
深度优先搜索(缩写DFS):
对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。
回溯法:
把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。
回溯法在编程中主要通过递归来实现。
回溯法解决迷宫问题
下图中,左上角为迷宫起点,右下角为迷宫终点。

编程思路
(以c#语言为例,其他语言相似)
初始化需要设置的相关参数:
public Stack<Point> path = new Stack<Point>(); //一条找到的路径
public Stack<Point> bestPath = new Stack<Point>(); //最优路径
其中 bestPath
为最优路径结果, 而 path
为递归过程中存储路径的堆栈,是一个不断在变化与更新的量。
主要递归函数如下(程序主要展现思路):
private void MazeTrack(int x, int y)
{
Point p = new Point(x, y);
path.Push(p);
mazeData[x, y] = 3;
//如果该位置是出口,输出结果
if (x == exitX && y == exitY)
{
//判断是否更优
if (bFrist)
{
//如果是找到的第一条路径,直接复制到最优路径
}
else
{
//不是第一条,则判断是否更短
//更短,复制到最优路径
}
}
//判断(x,y)位置的上、下、左、右是否可走
if ((x - 1) >= 0 && mazeData[x - 1, y] == 0)//上(x-1,y);存在且可走
{
MazeTrack(x - 1, y);
}
if ((x + 1) < mazeHeight && mazeData[x + 1, y] == 0)//下(x+1,y);存在且可走
{
MazeTrack(x + 1, y);
}
if ((y - 1) >= 0 && mazeData[x, y - 1] == 0)//左(x,y-1);存在且可走
{
MazeTrack(x, y - 1);
}
if ((y + 1) < mazeWidth && mazeData[x, y + 1] == 0)//右(x,y+1);存在且可走
{
MazeTrack(x, y + 1);
}
//上下左右均无法移动,则结束本层递归,返回上一节点
path.Pop();
mazeData[x, y] = 0; //设置为未走
}

本文来自博客园,作者:litecdows,作者在其他博客平台均使用此昵称!
转载请注明原文链接:https://www.cnblogs.com/litecdows/p/16549010.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库