• 代码随想录算法训练营第六十五天 | 岛屿数量 深搜、岛屿数量 广搜、岛屿的最大面积


    岛屿数量 深搜

    题目链接:99. 岛屿数量

    文字讲解:99. 岛屿数量 | 代码随想录

    解题思路

    本题已经说明,只有水平方向和竖直方向才能组成岛屿 

    本题思路,是遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。 

    1. #include
    2. using namespace std;
    3. int dir[4][2] = {0,1,1,0,0,-1,-1,0};
    4. void dfs(const vectorint>>& grid ,vectorbool>>& visited , int x, int y)
    5. {
    6. if(visited[x][y] || grid[x][y] == 0)
    7. {
    8. return; //访问过了,或者遇到海水后就返回
    9. }
    10. visited[x][y] = true;
    11. for(int i =0 ; i<4; i++)
    12. {
    13. int nextx = x + dir[i][0];
    14. int nexty = y + dir[i][1];
    15. int n = grid.size();
    16. int m = grid[0].size();
    17. if(nextx<0 || nextx >=n || nexty < 0 || nexty >= m)
    18. continue; //如果越界了,就直接下一个
    19. dfs(grid,visited,nextx,nexty);
    20. }
    21. }
    22. int main()
    23. {
    24. int result,n,m;
    25. cin>>n >> m;
    26. vectorint>> grid(n,vector<int>(m,0));
    27. vectorbool>> visited(n,vector<bool>(m,false));
    28. for(int i =0 ; i< n ; i++)
    29. {
    30. for(int j =0 ; j< m ; j++)
    31. {
    32. cin >> grid[i][j];
    33. }
    34. }
    35. result = 0 ; //目前岛屿为0
    36. for(int i =0 ; i< n ; i++)
    37. {
    38. for(int j =0 ; j< m ; j++)
    39. {
    40. if(!visited[i][j] && grid[i][j]==1)
    41. {
    42. //没有访问过,并且是陆地的话
    43. result++;
    44. dfs(grid,visited,i,j);
    45. }
    46. }
    47. }
    48. cout<< result << endl;
    49. }

    岛屿数量 广搜

    题目链接:99. 岛屿数量

    文字讲解:99. 岛屿数量 | 代码随想录

    解题思路

    本题的思路是一样的

    但是切记,入队就是标记为访问过了,否则会重复入队,如下图

     

    1. #include
    2. using namespace std;
    3. int dir[4][2] = {0,1,1,0,0,-1,-1,0};
    4. void bfs(const vectorint>>& grid ,vectorbool>>& visited , int x, int y)
    5. {
    6. queueint,int>> que;
    7. que.push({x,y});
    8. visited[x][y] = true; //入队就代表访问过了
    9. while(!que.empty())
    10. {
    11. pair<int,int> cur = que.front();
    12. que.pop();
    13. int curx = cur.first;
    14. int cury = cur.second;
    15. for(int i =0 ;i<4 ; i++)
    16. {
    17. int nextx = curx + dir[i][0];
    18. int nexty = cury + dir[i][1];
    19. int n = grid.size();
    20. int m = grid[0].size();
    21. if(nextx<0 || nextx >= n || nexty<0 || nexty >= m)
    22. continue; //越界就继续
    23. if(!visited[nextx][nexty] && grid[nextx][nexty] == 1)
    24. {
    25. que.push({nextx,nexty});
    26. visited[nextx][nexty] = true;
    27. }
    28. }
    29. }
    30. }
    31. int main()
    32. {
    33. int result,n,m;
    34. cin>>n >> m;
    35. vectorint>> grid(n,vector<int>(m,0));
    36. vectorbool>> visited(n,vector<bool>(m,false));
    37. for(int i =0 ; i< n ; i++)
    38. {
    39. for(int j =0 ; j< m ; j++)
    40. {
    41. cin >> grid[i][j];
    42. }
    43. }
    44. result = 0 ; //目前岛屿为0
    45. for(int i =0 ; i< n ; i++)
    46. {
    47. for(int j =0 ; j< m ; j++)
    48. {
    49. if(!visited[i][j] && grid[i][j]==1)
    50. {
    51. //没有访问过,并且是陆地的话
    52. result++;
    53. bfs(grid,visited,i,j);
    54. }
    55. }
    56. }
    57. cout<< result << endl;
    58. }

    岛屿的最大面积

    题目链接:100. 岛屿的最大面积
    文字讲解:100. 岛屿的最大面积 | 代码随想录

    解题思路

    与上两题一样的思路,这里使用广搜

    1. using namespace std;
    2. #include
    3. int dir[4][2] = {0,1,1,0,0,-1,-1,0};
    4. void bfs(const vectorint>>& grid , vectorbool>>& visited , int x , int y, int& area)
    5. {
    6. queueint,int>> que;
    7. que.push({x,y});
    8. visited[x][y] = true;
    9. area +=1; //第一个点也是面积
    10. while(!que.empty())
    11. {
    12. pair<int,int> cur = que.front();
    13. que.pop();
    14. int curx = cur.first;
    15. int cury = cur.second;
    16. for(int i=0 ; i<4; i++)
    17. {
    18. int nextx = curx + dir[i][0];
    19. int nexty = cury + dir[i][1];
    20. int n = grid.size();
    21. int m = grid[0].size();
    22. if(nextx<0 || nextx>= n || nexty < 0 || nexty >=m)
    23. continue;
    24. if(!visited[nextx][nexty] && grid[nextx][nexty]==1)
    25. {
    26. que.push({nextx,nexty});
    27. visited[nextx][nexty] = true;
    28. area+=1;
    29. }
    30. }
    31. }
    32. }
    33. int main()
    34. {
    35. int result = 0;
    36. int n,m;
    37. cin>>n>>m;
    38. vectorint>> grid(n,vector<int>(m,0));
    39. vectorbool>> visited(n,vector<bool>(m,false));
    40. for(int i =0 ; i
    41. {
    42. for(int j =0 ;j < m; j++)
    43. {
    44. cin>>grid[i][j];
    45. }
    46. }
    47. for(int i =0 ; i
    48. {
    49. for(int j =0 ;j < m; j++)
    50. {
    51. if(!visited[i][j] && grid[i][j]==1)
    52. {
    53. int area = 0;
    54. bfs(grid,visited,i,j,area);
    55. result = max(result,area);
    56. }
    57. }
    58. }
    59. cout << result << endl;
    60. }

  • 相关阅读:
    凝聚五城力量 2022Home尧泰汉海“益起微笑”公益活动圆满举行
    方舟开服务器游戏基础管理设置
    Spring框架中用于注入构造函数参数的标签constructor-arg
    葡萄糖-聚乙二醇-巯基Glucose-PEG-Alkyne|葡萄糖-聚乙二醇-生物素Glucose-PEG-Biotin
    【组件库】element-plus组件库
    后端秋招面经
    1283_Mike Zamansky讲解的emacs配置文件初步
    机房小探索
    23种设计模式之职责链模式(Chain of Responsibility Pattern)
    保险业SAP转型:奠定坚实的基础
  • 原文地址:https://blog.csdn.net/m0_73815931/article/details/139829885