当前位置: 首页 > article >正文

C++解决走迷宫问题:DFS、BFS算法应用

文章目录

  • 思路:
    • DFS
    • BFS
  • BFS和DFS的特点
    • BFS 与 DFS 的区别
    • BFS 的优点
    • BFS 时间复杂度
    • 深度优先搜索(DFS)的优点
    • 深度优先搜索(DFS)的时间复杂度
      • 解释:
      • 空间复杂度
      • 总结:


例如下面的迷宫:

// 迷宫的表示:0表示可以走,1表示障碍
vector<vector<int>> maze = {
   
    {
   0, 0, 1, 0, 0},
    {
   1, 0, 1, 1, 0},
    {
   1, 0, 0, 1, 0},
    {
   0, 0, 0, 0, 0},
    {
   1, 1, 1, 1, 0}
};

要实现解决迷宫的问题,可以使用回溯法深度优先搜索(DFS)或者广度优先搜索(BFS)。

思路:

迷宫中的 0 表示可走的路,1 表示障碍。
起点是 (0, 0),终点是 (n-1, m-1)。
可以向上、下、左、右四个方向移动。
通过回溯法探索每个可能的路径,当找到终点时,返回路径。

下面分别使用DFS和BFS来实现。

DFS

/*

深度搜索  dfs

*/

#include <iostream>
#include <vector>

using namespace std;

// 定义行的上下左右四个方向的移动
// -1表示向上移动,1表示向下移动,0表示不改变行
int row_dir[] = {
    -1, 1, 0, 0 };  

// 定义行的上下左右四个方向的移动
// -1表示向左移动,1表示向右移动,0表示不改变列
int col_dir[] = {
    0, 0, -1, 1 };

// 检查当前位置是否有效,且未被访问过
bool isValid(int x, int y, const vector<vector<int>>& maze, vector<vector<bool>>& visited) 
{
   
    return (x >= 0 && x < maze.size() && y >= 0 && y < maze[0].size() &&
        maze[x][y] == 0 && !visited[x][y]);
}

// 回溯法解决迷宫问题
bool solveMaze(int x, int y, const vector<vector<int>>& maze, 
    vector<vector<bool>>& visited, vector<pair<int, int>>& path) 
{
   
    // 到达终点
    if (x == maze.size() 

http://www.kler.cn/a/519350.html

相关文章:

  • erase() 【删数函数】的使用
  • 【精选】基于数据挖掘的招聘信息分析与市场需求预测系统 职位分析、求职者趋势分析 职位匹配、人才趋势、市场需求分析数据挖掘技术 职位需求分析、人才市场趋势预测
  • Spring整合Mybatis、junit纯注解
  • Linux 磁盘管理
  • Effective C++ 规则51:编写 new 和 delete 时需固守常规
  • FreeBSD里制作ubuntu22 jammy兼容环境的脚本
  • 力扣 Hot 100 题解 (js版)更新ing
  • 记录一个连不上docker中的mysql的问题
  • golang 使用双向链表作为container/heap的载体
  • python自动获取所需要的包并且保存到requirements.txt中
  • Redis高阶6-预热、雪崩、击穿、穿透问题
  • GoFrame MongoDB 使用指南
  • 【ESP32】ESP-IDF开发 | WiFi开发 | TCP传输控制协议 + TCP服务器和客户端例程
  • svn: E000111: Error running context: Connection refused
  • PCIe 个人理解专栏——【2】LTSSM(Link Training and Status State Machine)
  • 侧边栏布局和响应式布局的对比(Semi Design)
  • 查询本周一到周五的数据
  • STM32的Host U盘
  • vue3 el-form表格滚动
  • 数据库性能优化(sql优化)_SQL执行计划02_yxy
  • Kafka运维宝典 (三)- Kafka 最大连接数超出限制问题、连接超时问题、消费者消费时间超过限制问题详细介绍
  • Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)
  • AI x 长寿:OpenAI开发出逆龄AI GPT-4b micro
  • LabVIEW进行可靠性测试时有哪些常见的问题
  • 【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124
  • [LeetCode] 字符串 I — 344#反转字符串 | 541#反转字符串II | 54K替换数字