• C++深搜例题代码加讲解


            题目描述:给定一个二维数组,其中 0 表示陆地,1 表示水域,求有多少个岛屿(岛屿是由一块或多块相邻的陆地组成的,相邻指上下左右四个方向)。

    输入: [ [1,1,0,0,0], [1,1,0,0,0], [0,0,1,0,0], [0,0,0,1,1] ] 输出: 3

    1. #include
    2. #include
    3. using namespace std;
    4. int m, n; // m为行数,n为列数
    5. vectorint>> grid; // 存储地图的二维数组
    6. vectorbool>> visited; // 存储节点是否被访问过的二维数组
    7. // 判断当前节点是否在地图中,并且没有被访问过
    8. bool isValid(int i, int j) {
    9. return i >= 0 && i < m && j >= 0 && j < n && grid[i][j] == 0 && !visited[i][j];
    10. }
    11. // 深搜遍历当前节点的上下左右四个方向
    12. void dfs(int i, int j) {
    13. visited[i][j] = true;
    14. if (isValid(i-1, j)) dfs(i-1, j); // 上
    15. if (isValid(i+1, j)) dfs(i+1, j); // 下
    16. if (isValid(i, j-1)) dfs(i, j-1); // 左
    17. if (isValid(i, j+1)) dfs(i, j+1); // 右
    18. }
    19. int main() {
    20. // 初始化地图二维数组
    21. grid = {
    22. {1,1,0,0,0},
    23. {1,1,0,0,0},
    24. {0,0,1,0,0},
    25. {0,0,0,1,1},
    26. };
    27. // 初始化访问节点是否被访问过的二维数组
    28. m = grid.size();
    29. n = grid[0].size();
    30. visited = vectorbool>>(m, vector<bool>(n, false));
    31. int islandCount = 0; // 岛屿数量
    32. for (int i = 0; i < m; i++) {
    33. for (int j = 0; j < n; j++) {
    34. if (grid[i][j] == 0 && !visited[i][j]) { // 如果当前节点是陆地且未被访问过
    35. islandCount++; // 岛屿数量加1
    36. dfs(i, j); // 从当前节点开始深搜遍历
    37. }
    38. }
    39. }
    40. cout << "The number of islands is: " << islandCount << endl;
    41. return 0;
    42. }

            首先定义了一个isValid函数,用来判断当前节点是否在地图中,并且没有被访问过。

            然后定义了一个dfs函数,用来深搜遍历当前节点的上下左右四个方向。在遍历之前,需要将当前节点标记为已访问。

            最后在主函数中,遍历地图的每一个节点,如果节点是陆地且未被访问过,说明是一个新的岛屿,将岛屿数量加1,并从当前节点开始深搜遍历。

            注意:在初始化visited数组时,不能使用memset,因为visited不是一个一维数组,使用memset会出现数组访问越界的问题。正确的初始化方式是使用vector来初始化visited数组。

  • 相关阅读:
    2023秋招回顾--Java开发--个人心得
    八股文第八天
    Ubuntu22.04下安装Spark2.4.0(Local模式)
    CutMix原理与代码解读
    javabasic
    [C++从入门到精通] 9.inline、const、mutable、this和static
    LeetCode --- 1496. Path Crossing 解题报告
    电容笔好还是触屏笔好?便宜又好用的电容笔推荐
    智能工厂MES系统,终端设备支持手机、PDA、工业平板、PC
    Java基于springboot+vue的图书馆网上图书借阅系统 nodejs前后端分离
  • 原文地址:https://blog.csdn.net/SYC20110120/article/details/133970232