🐵指尖猴全新升级
第21课:综合实战:迷宫最短路
🗺️

综合实战:迷宫最短路

走进迷宫,BFS带你找到最近的出口!

📖知识引入

🧱迷宫建模
#是墙.是路,每个可走格子就是图上的一个顶点
🔗隐式建图
相邻的可走格子之间默认有边,不必真的把图存下来
📏dist数组
记录起点到每个格子的最少步数,还能顺便判重
🎯方向数组
dx、dy四方向配循环,上下左右移动不用写四遍
💡
BFS判重用dist==-1,入队的那一刻立刻赋值,千万别等出队再标

🔍BFS走迷宫

#include <queue>
#include <cstring>
using namespace std;

char maze[105][105];
int dist[105][105];
int dx[4] = {0, 0, 1, -1};   // 四个方向的横坐标增量
int dy[4] = {1, -1, 0, 0};   // 对应的纵坐标增量

int bfs(int sx, int sy, int ex, int ey) {
    memset(dist, -1, sizeof(dist));
    queue<pair<int,int>> q;
    q.push({sx, sy});
    dist[sx][sy] = 0;
    while (!q.empty()) {
        pair<int,int> cur = q.front(); q.pop();
        int x = cur.first, y = cur.second;
        if (x == ex && y == ey) return dist[x][y];  // 到达出口
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if (maze[nx][ny] == '.' && dist[nx][ny] == -1) {
                dist[nx][ny] = dist[x][y] + 1;
                q.push({nx, ny});
            }
        }
    }
    return -1;  // 根本走不到出口
}

方向数组+队列+dist,迷宫最短步数一次拿下。

🎯小测验

第1题:迷宫最短步数首选什么算法?

第2题:格子迷宫中的“图”体现在哪?

第3题:dist[nx][ny]==-1在这里的作用是?

📝本课知识点

  • ✓格子迷宫=隐式图
  • ✓BFS求最短步数
  • ✓方向数组配四方向
第21课完成!继续探索下一课吧 🚀