• day-63 代码随想录算法训练营(19) 图论 part 02


    1020.飞地的数量

    分析:求不跟边界接壤的陆地的数量
    思路一:深度优先遍历
    • 先从四个侧边找陆地,然后进行深度优先遍历,把所有接壤的陆地(1)全部转换成海洋(0)
      • 深度优先遍历:从四个方向进行递归遍历
    • 遍历整个图,统计所有陆地的数量。
    1. class Solution {
    2. public:
    3. int direct[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    4. int res=0;
    5. void dfs(vectorint>>&grid,int x,int y){
    6. grid[x][y]=0;
    7. for(int i=0;i<4;i++){
    8. int nextx=x+direct[i][0];
    9. int nexty=y+direct[i][1];
    10. if(nextx>=0 && nextxsize() && nexty>=0 && nexty0].size()){//边界条件
    11. if(grid[nextx][nexty]==1){
    12. grid[nextx][nexty]=0;
    13. dfs(grid,nextx,nexty);
    14. }
    15. }
    16. }
    17. }
    18. int numEnclaves(vectorint>>& grid) {
    19. int n=grid.size(),m=grid[0].size();
    20. for(int i=0;i
    21. if(grid[i][0]==1) dfs(grid,i,0);//左侧边
    22. if(grid[i][m-1]==1) dfs(grid,i,m-1);//右侧边
    23. }
    24. for(int j=0;j
    25. if(grid[0][j]==1) dfs(grid,0,j);//上侧边
    26. if(grid[n-1][j]==1) dfs(grid,n-1,j);//下侧边
    27. }
    28. for(int i=1;i-1;i++){//遍历整个图
    29. for(int j=1;j-1;j++){
    30. if(grid[i][j]==1) res++;
    31. }
    32. }
    33. return res;
    34. }
    35. };

    130.被围绕的区域

    思路一:dfs
    • 依然是从四个侧面把陆地深度优先遍历,然后改成 A 字符
    • 然后遍历整个图,把剩余的陆地(必然被海水包裹)变为海水,A 字符变为陆地
    1. class Solution {
    2. public:
    3. int direct[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    4. int res=0;
    5. void dfs(vectorchar>>&board,char target,int x,int y)
    6. {
    7. board[x][y]=target;
    8. res++;
    9. for(int i=0;i<4;i++){
    10. int nextx=x+direct[i][0];
    11. int nexty=y+direct[i][1];
    12. if(nextx>=0 && nextxsize() && nexty>=0 && nexty0].size()){
    13. if(board[nextx][nexty]=='O'){
    14. board[nextx][nexty]=target;
    15. dfs(board,target,nextx,nexty);
    16. }
    17. }
    18. }
    19. }
    20. void solve(vectorchar>>& board) {
    21. int n=board.size(),m=board[0].size();
    22. for(int i=0;i
    23. if(board[i][0]=='O') dfs(board,'A',i,0);//左侧边
    24. if(board[i][m-1]=='O') dfs(board,'A',i,m-1);//右侧边
    25. }
    26. for(int j=0;j
    27. if(board[0][j]=='O') dfs(board,'A',0,j);//上侧边
    28. if(board[n-1][j]=='O') dfs(board,'A',n-1,j);//下侧边
    29. }
    30. for(int i=0;i
    31. for(int j=0;j
    32. if(board[i][j]=='A') board[i][j]='O';//所有的A变为O
    33. else if(board[i][j]=='O') board[i][j]='X';//所有的O变为X
    34. }
    35. }
    36. }
    37. };

    417.太平洋大西洋流水问题

    思路一:深度优先遍历
    • 分别从大西洋和太平洋一侧,倒着推得到两个数组
    • 当两个数组都经过同一位置时,说明可以流向两边
    1. class Solution {
    2. public:
    3. int direct[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    4. void dfs(vectorint>>&heights,vectorbool>>&visted,int x,int y){
    5. if(visted[x][y]) return;
    6. visted[x][y]=true;
    7. for(int i=0;i<4;i++){
    8. int nextx=x+direct[i][0];
    9. int nexty=y+direct[i][1];
    10. if(nextx>=0 && nextxsize() && nexty>=0 && nexty0].size()){
    11. if(heights[x][y]<=heights[nextx][nexty])//本来是从高到低,这是倒着推,所以低到高
    12. dfs(heights,visted,nextx,nexty);
    13. }
    14. }
    15. }
    16. vectorint>> pacificAtlantic(vectorint>>& heights) {
    17. int n=heights.size(),m=heights[0].size();
    18. vectorint>>res;
    19. vectorbool>>pacific(n,vector<bool>(m,false));//太平洋
    20. vectorbool>>atlantic(n,vector<bool>(m,false));//大西洋
    21. for(int i=0;i
    22. dfs(heights,pacific,i,0);//从左侧太平洋出发
    23. dfs(heights,atlantic,i,m-1);//从右侧大西洋出发
    24. }
    25. for(int j=0;j
    26. dfs(heights,pacific,0,j);//从上侧太平洋出发
    27. dfs(heights,atlantic,n-1,j);//从下侧大西洋出发
    28. }
    29. for(int i=0;i
    30. for(int j=0;j
    31. if(pacific[i][j] && atlantic[i][j])//从大西洋和太平洋都可以流过
    32. res.push_back({i,j});
    33. }
    34. }
    35. return res;
    36. }
    37. };

  • 相关阅读:
    c++ 内存顺序
    苍穹外卖day1--开发环境搭建
    Android 视频播放
    【算法】堆排序 详解
    22.C++之类模板
    Python使用OpenCV加载彩色图像为BGR图、计算每个图像通道的均值(mean of each channel)、可视化图像在每个通道的均值
    记录C++类中的一次函数调用
    HTML网页设计【足球科普】学生DW静态网页设计
    chapter14-集合——(List)——day17
    基本数据类型之字符串
  • 原文地址:https://blog.csdn.net/Ricardo_XIAOHAO/article/details/133444385