news 2026/9/22 1:45:07

随机深度优先搜索(Randomized DFS)算法原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
随机深度优先搜索(Randomized DFS)算法原理

随机深度优先搜索是深度优先搜索的变种,通过在每一步随机选择邻接节点来增加路径的不可预测性。该算法天然适合生成或解决迷宫问题,因其倾向于生成长而曲折的路径。

核心特点:

  • 使用栈(显式或隐式)实现回溯
  • 随机选择邻接节点顺序
  • 时间复杂度为O(V+E),空间复杂度为O(V)

C++实现关键步骤

数据结构定义
#include <iostream> #include <vector> #include <stack> #include <cstdlib> #include <ctime> #include <algorithm> struct Cell { int x, y; bool visited = false; bool top_wall = true, bottom_wall = true; bool left_wall = true, right_wall = true; };
迷宫初始化
void initMaze(std::vector<std::vector<Cell>>& maze, int width, int height) { maze.resize(height); for (int y = 0; y < height; ++y) { maze[y].resize(width); for (int x = 0; x < width; ++x) { maze[y][x].x = x; maze[y][x].y = y; } } std::srand(std::time(nullptr)); }
随机DFS核心实现
void generateMaze(std::vector<std::vector<Cell>>& maze) { std::stack<Cell*> cellStack; Cell* current = &maze[0][0]; current->visited = true; cellStack.push(current); while (!cellStack.empty()) { current = cellStack.top(); auto neighbors = getUnvisitedNeighbors(current, maze); if (!neighbors.empty()) { Cell* next = neighbors[std::rand() % neighbors.size()]; removeWalls(current, next); next->visited = true; cellStack.push(next); } else { cellStack.pop(); } } }
辅助函数实现
std::vector<Cell*> getUnvisitedNeighbors(Cell* cell, const std::vector<std::vector<Cell>>& maze) { std::vector<Cell*> neighbors; int dx[] = {0, 1, 0, -1}; int dy[] = {-1, 0, 1, 0}; for (int i = 0; i < 4; ++i) { int nx = cell->x + dx[i]; int ny = cell->y + dy[i]; if (nx >= 0 && nx < maze[0].size() && ny >= 0 && ny < maze.size() && !maze[ny][nx].visited) { neighbors.push_back(const_cast<Cell*>(&maze[ny][nx])); } } return neighbors; } void removeWalls(Cell* a, Cell* b) { if (a->x == b->x) { if (a->y < b->y) { a->bottom_wall = false; b->top_wall = false; } else { a->top_wall = false; b->bottom_wall = false; } } else { if (a->x < b->x) { a->right_wall = false; b->left_wall = false; } else { a->left_wall = false; b->right_wall = false; } } }

迷宫求解实现

路径搜索算法
bool solveMaze(std::vector<std::vector<Cell>>& maze, Cell* start, Cell* end, std::vector<Cell*>& path) { std::stack<Cell*> stack; stack.push(start); start->visited = true; while (!stack.empty()) { Cell* current = stack.top(); path.push_back(current); if (current == end) return true; auto neighbors = getAccessibleNeighbors(current, maze); if (!neighbors.empty()) { Cell* next = neighbors[std::rand() % neighbors.size()]; next->visited = true; stack.push(next); } else { path.pop_back(); stack.pop(); } } return false; }
可通行邻居检测
std::vector<Cell*> getAccessibleNeighbors(Cell* cell, const std::vector<std::vector<Cell>>& maze) { std::vector<Cell*> neighbors; int dx[] = {0, 1, 0, -1}; int dy[] = {-1, 0, 1, 0}; bool walls[] = {cell->top_wall, cell->right_wall, cell->bottom_wall, cell->left_wall}; for (int i = 0; i < 4; ++i) { if (!walls[i]) { int nx = cell->x + dx[i]; int ny = cell->y + dy[i]; if (nx >= 0 && nx < maze[0].size() && ny >= 0 && ny < maze.size() && !maze[ny][nx].visited) { neighbors.push_back(const_cast<Cell*>(&maze[ny][nx])); } } } return neighbors; }

可视化输出

控制台打印迷宫
void printMaze(const std::vector<std::vector<Cell>>& maze) { for (const auto& row : maze) { // 打印顶部墙壁 for (const auto& cell : row) { std::cout << (cell.top_wall ? "+---" : "+ "); } std::cout << "+\n"; // 打印侧边墙壁 for (const auto& cell : row) { std::cout << (cell.left_wall ? "|" : " "); std::cout << " "; } std::cout << "|\n"; } // 打印底部边界 for (size_t i = 0; i < maze[0].size(); ++i) { std::cout << "+---"; } std::cout << "+\n"; }

完整示例调用

int main() { const int WIDTH = 10, HEIGHT = 10; std::vector<std::vector<Cell>> maze; initMaze(maze, WIDTH, HEIGHT); generateMaze(maze); std::vector<Cell*> path; solveMaze(maze, &maze[0][0], &maze[HEIGHT-1][WIDTH-1], path); printMaze(maze); return 0; }

算法优化方向

  • 记忆化搜索:记录已探索路径避免重复计算
  • 双向搜索:从起点和终点同时进行搜索
  • 启发式引导:结合曼哈顿距离等启发式信息
  • 并行化处理:利用多线程加速搜索过程

该实现完整展示了随机DFS在迷宫生成与求解中的应用,通过随机选择邻接节点使得每次生成的迷宫都具有独特性,同时保持算法的高效性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 19:35:07

9 个 MBA 论文降AI工具,AI 写作优化推荐

9 个 MBA 论文降AI工具&#xff0c;AI 写作优化推荐 论文写作的战场&#xff0c;你是否也在挣扎&#xff1f; MBA毕业论文不仅是对专业知识的总结&#xff0c;更是对个人研究能力和学术素养的全面检验。然而&#xff0c;对于许多MBA学生来说&#xff0c;这却是一场艰难的战役。…

作者头像 李华
网站建设 2026/9/22 1:22:45

10 个高效降AI率工具,自考党必备!

10 个高效降AI率工具&#xff0c;自考党必备&#xff01; AI降重工具&#xff1a;自考党论文的“隐形护盾” 在当前学术写作环境中&#xff0c;随着AI技术的广泛应用&#xff0c;论文中出现AIGC痕迹的风险显著增加。对于自考学生而言&#xff0c;如何在保证内容质量的同时降低查…

作者头像 李华
网站建设 2026/9/21 12:44:43

测试技术如何应用于股市个股的风险评测?

测试技术应用于股市个股风险评测&#xff0c;核心是通过量化指标计算、历史数据回测、多维度因子验证&#xff0c;识别个股的潜在风险点&#xff08;如价格波动风险、基本面恶化风险、流动性风险等&#xff09;&#xff0c;并给出风险等级或预警信号。其应用逻辑遵循“数据采集…

作者头像 李华
网站建设 2026/9/21 5:09:03

Java毕设选题推荐:基于java的畅销图书推荐系统基于springboot+vue的畅销图书推荐系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/20 3:30:15

计算机Java毕设实战-基于JavaWeb的智慧养老院管理系统的设计与实现访客记录、病历档案、入院指南、药品信息【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/21 0:39:07

计算机Java毕设实战-基于JavaWeb的心聘求职平台的设计与实现基于springboot的人才求职招聘平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华