• C++广搜例题代码加讲解(1)


            题目描述:在一个n*m大小的网格中,1代表障碍物,0代表可以通过,从左上角走到右下角,每次只能上下左右移动一格,求最短路径长度。

    示例输入:

    5 5 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0

    示例输出:

    13

    1. #include
    2. #include
    3. using namespace std;
    4. const int N = 110;
    5. int n, m;
    6. int g[N][N]; // 存储地图(0表示可以通过,1表示障碍物)
    7. int dis[N][N]; // 存储每个位置到起点的最短路径长度,初始化为-1
    8. int dx[4] = {-1, 0, 1, 0}; // 四个方向的x坐标变化
    9. int dy[4] = {0, 1, 0, -1}; // 四个方向的y坐标变化
    10. struct Node { // 存储每个位置的坐标
    11. int x, y;
    12. };
    13. // 判断当前位置是否可以走(不越界且不是障碍物且之前没有被访问过)
    14. bool check(int x, int y) {
    15. if (x < 0 || x >= n || y < 0 || y >= m || g[x][y] == 1 || dis[x][y] != -1) {
    16. return false;
    17. }
    18. return true;
    19. }
    20. void bfs() {
    21. queue q;
    22. q.push({0, 0});
    23. dis[0][0] = 0; // 起点到起点的距离为0
    24. while (!q.empty()) {
    25. auto t = q.front();
    26. q.pop();
    27. for (int i = 0; i < 4; i++) {
    28. int x = t.x + dx[i];
    29. int y = t.y + dy[i];
    30. if (check(x, y)) { // 如果当前位置可以走,就进队
    31. q.push({x, y});
    32. dis[x][y] = dis[t.x][t.y] + 1; // 更新最短路径长度
    33. }
    34. }
    35. }
    36. }
    37. int main() {
    38. cin >> n >> m;
    39. for (int i = 0; i < n; i++) {
    40. for (int j = 0; j < m; j++) {
    41. cin >> g[i][j];
    42. dis[i][j] = -1; // 初始化为-1
    43. }
    44. }
    45. bfs();
    46. cout << dis[n - 1][m - 1]; // 输出终点到起点的最短路径长度
    47. return 0;
    48. }

    代码讲解:

    1. 定义g数组存储地图,定义dis数组存储每个位置到起点的最短路径长度,初始化为-1。定义dx数组和dy数组存储四个方向的坐标变化。
    2. 定义一个check判断函数,判断当前位置是否可以走。若越界、为障碍物或已访问过,则返回假,否则返回真。
    3. 首先将起点加入队列,并将起点到起点的距离为0。
    4. 当队列不空时,取出队首位置t,并向四个方向探索。若当前位置可以走,则将当前位置加入队列,并更新最短路径长度。
    5. 当队列为空时,结束搜索。
    6. 输出终点到起点的最短路径长度dis[n-1][m-1]
  • 相关阅读:
    02【HTML快速入门】
    Java中的排序接口Comparable和比较器Comparator详解
    优化Scrum敏捷需求管理流程,敏捷需求如何管理。
    Flutter3.10版本发布,编程语言的重大更新
    Scala 的安装教程
    maya 设置半径 获取时长,设置时长
    第七章 查找 二、顺序查找
    java商城免费搭建 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城
    【Java中23种设计模式-单例模式--饿汉式】
    前端工程师的vue面试题笔记
  • 原文地址:https://blog.csdn.net/SYC20110120/article/details/133970271