50、【图】迷宫问题——BFS(C/C++版)
发布日期:2021-05-08 14:54:34 浏览次数:17 分类:精选文章

本文共 1595 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找到从迷宫的左上角移动到右下角的最短路径。这个问题可以通过广度优先搜索(BFS)来解决,因为BFS能够保证找到最短路径。

方法思路

  • 问题分析:迷宫由0和1组成,0表示可以走的路,1表示墙壁。起点是左上角 (0,0),终点是右下角 (n-1, m-1)。我们需要找到从起点到终点的最少移动次数。

  • 算法选择:使用BFS来进行层序遍历。BFS确保第一次到达终点的路径就是最短路径。

  • 数据结构:使用一个队列来处理当前层的所有位置,并使用一个距离数组记录每个位置到起点的最短距离。

  • 步骤

    • 初始化距离数组,起点距离为0,其余为-1。
    • 将起点加入队列。
    • 从队列中取出当前位置,检查四个方向(上、下、左、右)。
    • 对于每个方向,如果新的位置是可通行的且未被访问过,更新距离并将其加入队列。
    • 当处理到终点时,返回距离。
  • 解决代码

    #include 
    int main() { int n, m; scanf("%d %d", &n, &m); int g[n][m]; for (int i = 0; i < n; ++i) { int row[m]; scanf("%d", row); for (int j = 0; j < m; ++j) { g[i][j] = row[j]; } } int d[n][m]; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { d[i][j] = -1; } } d[0][0] = 0; int qX[n * m], qY[n * m]; int front = 0, rear = 0; qX[rear] = 0; qY[rear] = 0; rear++; int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1}; while (front < rear) { int x = qX[front]; int y = qY[front]; front++; for (int i = 0; i < 4; ++i) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && ny >= 0 && nx < n && ny < m) { if (g[nx][ny] == 0 && d[nx][ny] == -1) { d[nx][ny] = d[x][y] + 1; qX[rear] = nx; qY[rear] = ny; rear++; } } } } return d[n-1][m-1];}

    代码解释

    • 读取输入:读取迷宫的大小n和m,以及迷宫的二维数组g。
    • 初始化距离数组:创建一个距离数组d,初始化为-1,起点距离设为0。
    • 队列初始化:将起点坐标加入队列。
    • BFS处理:从队列中取出当前位置,检查四个方向,更新可通行位置的距离,并将新位置加入队列。
    • 返回结果:当处理完队列后,返回终点的距离,即为最短路径的移动次数。
    上一篇:MATLAB——操作矩阵的常用函数
    下一篇:49、【图】N-皇后问题(C/C++版)

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年03月21日 13时29分32秒