您的位置:首页 >C++迷宫寻路算法实现:DFS与BFS对比实战
发布于2026-01-26 阅读(0)
扫一扫,手机访问
DFS迷宫寻路需用visited数组防重复访问和死循环;用方向数组遍历四邻,越界、撞墙或已访问则跳过;到达终点时将坐标加入path,递归回溯构建完整路径。

迷宫寻路本质是图的遍历问题,C++ 中 DFS 最自然的写法是递归——每步尝试上下左右,失败就自动回溯。关键不是“怎么写递归”,而是**怎么避免重复访问和死循环**。
visited 二维布尔数组(或直接修改原迷宫标记为障碍),否则会反复进入同一格子vector> dirs = {{-1,0},{0,1},{1,0},{0,-1}}; ,比硬写四次 if 更易维护1)或已访问vector>& path ,在成功时逐层 push_back 当前点void dfs(vector>& maze, int x, int y, vector >& visited, const pair & end, vector >& path) { if (x == end.first && y == end.second) { path.push_back({x, y}); return; } visited[x][y] = true; for (auto [dx, dy] : dirs) { int nx = x + dx, ny = y + dy; if (nx >= 0 && nx < maze.size() && ny >= 0 && ny < maze[0].size() && !visited[nx][ny] && maze[nx][ny] == 0) { dfs(maze, nx, ny, visited, end, path); if (!path.empty()) { // 找到路径就提前退出 path.push_back({x, y}); return; } } } }
BFS 天然适合求无权图最短路径,迷宫中每步代价相同,所以 BFS 第一次抵达终点时,路径长度一定最短。但要注意:**BFS 不回溯,必须显式记录每个节点的前驱**,否则无法还原路径。
queue> 存待扩展坐标,用 vector>> prev 记录每个位置的上一步(初始化为 {-1,-1})prev 往回跳,用 stack 或 reverse 存路径map, pair> 存前驱——哈希开销大,二维 vector 随机访问更快y * width + x)压缩空间vector> bfs(vector >& maze, pair start, pair end) { int n = maze.size(), m = maze[0].size(); vector > visited(n, vector (m, false)); vector >> prev(n, vector >(m, {-1,-1})); queue > q; q.push(start); visited[start.first][start.second] = true; while (!q.empty()) { auto [x, y] = q.front(); q.pop(); if (x == end.first && y == end.second) break; for (auto [dx, dy] : dirs) { int nx = x + dx, ny = y + dy; if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && maze[nx][ny] == 0) { visited[nx][ny] = true; prev[nx][ny] = {x, y}; q.push({nx, ny}); } } } // 重构路径 vector<pair<int,int>> path; for (auto p = end; p != make_pair(-1,-1); p = prev[p.first][p.second]) { path.push_back(p); } reverse(path.begin(), path.end()); return path;}
两者时间复杂度都是 O(V+E),但实际表现差异明显。不是“哪个更好”,而是“哪个更合适”。
算法逻辑正确,不代表程序能过所有测试。真实场景下,这些细节常导致 WA 或 TLE。
'0' 和 '1'),别直接当整数用;用 grid[i][j] == '0' 判断通路[row][col] 还是 [x][y]-Wl,--stack,33554432(32MB)或改非递归visited=true,而不是出队时才设,否则同一格子可能被多个邻居同时加入队列DFS 和 BFS 在迷宫里看起来只是“栈换队列”,但路径性质、内存行为、调试难度完全不同。动手前先问自己:我要的是“有解就行”,还是“必须最短”?这个判断比写对循环体更重要。
上一篇:巨量百应官网链接及网页端入口
下一篇:百度云网页版登录入口指南
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9