回溯法求迷宫问题

news/2024/10/12 1:07:28

回溯法求迷宫问题

求解思路

1.初始化迷宫:定义一个二维数组表示迷宫,并设定起点和终点。
2.定义回溯函数:通过递归方式探索每一条路径,更新当前路径和步数。
3.剪枝策略:在每一步判断是否需要继续深入(如步数是否已超过最短路径)。
4.输出结果:记录并输出最短路径的长度。

回溯法的基本思想

回溯法通过构建搜索树来逐步尝试所有可能的路径。对于迷宫问题,主要步骤如下:

1.从起点开始,尝试向四个方向(下、左、右、上)移动。
2.如果移动到的新位置是可通行的,则继续进行移动。
3.在每次移动后,检查是否到达终点。
4.若当前位置不再有可移动路径,则回退到上一步,尝试其他方向(即“回溯”)。
5.使用剪枝策略避免不必要的计算,例如:
6.标记已访问的节点,防止重复访问。
7.检查当前路径长度是否已经超过已知的最短路径长度。

代码如下

#include<bits/stdc++.h>
using namespace std;int minSteps = INT_MAX;
int sx,sy,ex,ey;
int n,m;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, -1, 0, 1};
int visited[110][110];
char mig[110][110];//迷宫 void backtrack(int x, int y, int steps) {if (x == ex && y == ey) {if (steps < minSteps) {minSteps = steps;}return;}if (steps >= minSteps) return;for (int i = 0; i < 4; ++i) {int newX = x + dx[i];int newY = y + dy[i];if(mig[newX][newY] == '#'){visited[newX][newY] = 1;}if (newX >= 1 && newX <= n && newY >= 1 && newY <= m && mig[newX][newY] == '.') {visited[newX][newY] = 1;backtrack(newX, newY,  steps + 1);visited[newX][newY] = 0;}}
}int main() {cin>>n>>m;for(int i = 1; i <= n; i++){scanf("%s", mig[i]+1);}cin>>sx>>sy>>ex>>ey;visited[sx][sy] = 1;backtrack(sx, sy, 0);if (minSteps < INT_MAX) {cout << "最小步数: " << minSteps << endl;} else {cout << "无解" << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/70462.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Design Compiler多时钟约束

这里的资料来源于《Synopsys Timing Constraints and Optimization User Guide, Version P-2019.03-SP4, September 2019》 下面图中这几种情况都是我在实际项目中碰到过的,因此有必要单独做个说明。 第一个是同步派生时钟,即CK2是通过CK1的分频来产生的,我们之前的一个实际…

uniapp创建小程序

uniapp创建小程序https://www.dcloud.io/一、安装Hbuilder和对应基本操作 ​ 安装Hbuilder这里就不在赘述。 (一)、插件安装: ​ 如果考虑到后续需要使用Scss,可以前往插件市场进行搜索安装,浏览器会提示我们是否需要打开对应的HbuilderX,然后进入应用进行安装。(二)…

labelme使用方法

labelme是一款在实例分割、语义分割、目标检测等任务中的一个常用工具,本文将介绍如何使用labelme。 labelme有各种版本,包括ubuntu、windows、macOS等。关于windows版本,也可以下载其相关的exe文件https://github.com/wkentaro/labelme/releases来使用标注 一、安装labelme…

《综合与Design Compiler》笔记

《综合与Design Compiler》笔记 一直没系统的整理过DC这块的东西,这里借助一个挺好的文档《综合与Deisgn Compiler》以及我自己的经验和理解来归总一下。 1. 综合是什么 综合是使用软件的方法来设计硬件,然后将门级电路实现与优化的工作留给综合工具的一种设计方法。它是根据…

C# unsafe 快速复制数组

/// <summary>/// 复制内存/// </summary>/// <param name="dest">目标指针位置</param>/// <param name="src">源指针位置</param>/// <param name="count">字节长度</param>/// <returns&…

11.Java集合框架_Set接口

Set接口和常用方法 基本介绍无序(添加和取出的顺序不一致),没有索引。 不允许重复元素,所以最多包含一个null。 JDK API中Set接口的实现类有HashSet、LinkedHashSet和TreeSet。set接口常用方法 和List接口一样,set接口也是Collection的子接口,因此,常用方法和Collection…

罗技鼠标永久宏定义设置

背景 写程序用到最多的组合按键就是ctrl+c, ctrl+v, 而这些能不能在鼠标上实现,这样就能解放左手了(机智如我) 硬件 需要一款支持宏定义的鼠标,而罗技系列正好拥有(未收广告费),目前尝试在g102, g304, gpwer代上都可运行 思路 使用ghub软件定义宏后加载到鼠标的板载内存上遇…