DFS:floodfill算法解决矩阵联通块问题

这篇具有很好参考价值的文章主要介绍了DFS:floodfill算法解决矩阵联通块问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记

 floodfill,翻译为洪水灌溉,而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。

一、图像渲染

. - 力扣(LeetCode)

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记

class Solution {
public:
   int dx[4]={0,0,1,-1};
   int dy[4]={1,-1,0,0};
   int prev;//记住初始值
   int m,n;
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) 
    {
       //先考虑边界条件,如果对应位置和color是一样的,那么直接返回
       if(image[sr][sc]==color) return image;
       m=image.size(),n=image[0].size();
       prev=image[sr][sc];
       dfs(image,sr,sc,color); 
       return image;
    }

    void dfs(vector<vector<int>>& image, int i, int j, int color) //直接用引用,在矩阵上修改
    {
       //第一步,将当前位置修改成color
       image[i][j]=color;
       //第二步,用向量定义四个方向,然后去找
       for(int k=0;k<4;++k)
       {
        int x=i+dx[k],y=j+dy[k];
        if(x>=0&&x<m&&y>=0&&y<n&&image[x][y]==prev)
            dfs(image,x,y,color);
       }
    }
};

 二、岛屿问题

. - 力扣(LeetCode)

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记

class Solution {
public:
    int ret=0;
    bool check[300][300];
    int m,n;
    int numIslands(vector<vector<char>>& grid) 
    {
        m=grid.size(),n=grid[0].size();
        for(int i=0;i<m;++i)
          for(int j=0;j<n;++j)
         {
          if(!check[i][j]&&grid[i][j]=='1')//该数没被选过并且为1
          {
            ++ret;//说明找到一块岛屿
            dfs(grid,i,j);//然后让dfs去相邻位置将对应的子块给标记成true
          } 
         }
         return ret;
    }
   int dx[4]={0,0,1,-1};
   int dy[4]={1,-1,0,0};
    void dfs(vector<vector<char>>& grid,int i,int j)
    {
        //首先先把当前位置标记成选过
        check[i][j]=true;
        //然后通过向量去其他位置找
        for(int k=0;k<4;++k)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&!check[x][y]&&grid[x][y]=='1')
               dfs(grid,x,y);//继续去下一个位置找
        }
    }
};

三、岛屿的最大面积

. - 力扣(LeetCode)

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记

class Solution {
public:
    bool check[50][50];
    int m,n;
    int count;//数每个字块的岛屿数量
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int maxAreaOfIsland(vector<vector<int>>& grid) 
    {
       m=grid.size(),n=grid[0].size();
       int ret=0;
       for(int i=0;i<m;++i)
         for(int j=0;j<n;++j)
            if(!check[i][j]&&grid[i][j]==1)
              {
                 count=0;//重置count
                 dfs(grid,i,j);
                 ret=max(ret,count);
              }
          return ret;
    }
     void dfs(vector<vector<int>>& grid,int i,int j)
     {
         ++count;
        check[i][j]=true;
        for(int k=0;k<4;++k)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&!check[x][y]&&grid[x][y]==1)
            {
                 dfs(grid,x,y);
            }
        }
     }
};

四、被围绕的区域

. - 力扣(LeetCode)

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记

class Solution {
public:
    //正难则反,先去找边界
    //1先找到边界的o,然后用dfs去找 找到了就修改成.
    //2此时矩阵里的o肯定是在区域内的了,直接遍历一遍矩阵修改即可,顺便把.修改成圈
    int m,n;
    void solve(vector<vector<char>>& board) 
    {
      m=board.size(),n=board[0].size();
      //先处理第一行的最后一行
      for(int j=0;j<n;++j)
      {
        if(board[0][j]=='O') dfs(board,0,j);
        if(board[m-1][j]=='O') dfs(board,m-1,j);
      }
      //处理第一列和第二列
      for(int i=0;i<m;++i)
      {
        if(board[i][0]=='O')dfs(board,i,0);
        if(board[i][n-1]=='O') dfs(board,i,n-1);
      }
      //此时剩下位置的O给他改成X,然后.复原成O
      for(int i=0;i<m;++i)
       for(int j=0;j<n;++j)
       {
        if(board[i][j]=='.') board[i][j]='O';
        else if(board[i][j]=='O') board[i][j]='X';
       }
    }
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    void dfs(vector<vector<char>>& board,int i,int j)
    {
       //先将当前位置改成.
       board[i][j]='.';
       for(int k=0;k<4;++k)
       {
        int x=i+dx[k],y=j+dy[k];
        if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O') dfs(board,x,y);
       }
    }
};

五、太平洋大西洋水流问题

. - 力扣(LeetCode)

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记

class Solution {
public:
    //思路,正难则反,用两个标记数组去标记两个大洋的位置
    int m,n;
    vector<vector<int>> ret;//记录返回值
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& h) 
    {
      m=h.size(),n=h[0].size();
     //设置两个标记数组
      vector<vector<bool>> pac(m,vector<bool>(n));
      auto atl=pac;
      //先去找pac
      for(int j=0;j<n;++j) dfs(h,0,j,pac);
      for(int i=0;i<m;++i) dfs(h,i,0,pac);
      //再去找atl
      for(int j=0;j<n;++j) dfs(h,m-1,j,atl);
      for(int i=0;i<m;++i) dfs(h,i,n-1,atl);
      //然后根据两个标记数组,去记录下标
      for(int i=0;i<m;++i)
        for(int j=0;j<n;++j)
          if(pac[i][j]&&atl[i][j])//如果坐标同时被两个数组标记了,就统计最终的结果
            ret.push_back({i,j});
            return ret;
    }
    void dfs(vector<vector<int>>& h,int i,int j, vector<vector<bool>>&vis)
    {
        //先将该点设置为选过
        vis[i][j]=true;
        //定义四个方向,然后去找
        for(int k=0;k<4;++k)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&!vis[x][y]&&h[x][y]>=h[i][j])
              dfs(h,x,y,vis);
        }
    }
};

六、扫雷游戏

. - 力扣(LeetCode)

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记

class Solution {
public:
    int dx[8]={0,0,1,-1,1,1,-1,-1};
    int dy[8]={1,-1,0,0,1,-1,1,-1}; //周围的八个方向
    int m,n;
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) 
    {
       m=board.size(),n=board[0].size();
       //考虑边界情况,如果是雷,直接返回
       int x=click[0],y=click[1];
       if(board[x][y]=='M') 
       {
        board[x][y]='X';
       }
       else//说明不是雷,dfs去判断该位置的情况
       {
          dfs(board,x,y);
       }
       return board;
    }

    void dfs(vector<vector<char>>& board,int i,int j)
    {
       //进行搜索
       int count=0;//用来数雷
       for(int k=0;k<8;++k)
       {
        int x=i+dx[k],y=j+dy[k];
        if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='M') ++count;
       }
       if(count) board[i][j]='0'+count;
       else  //没有雷,就继续去展开
       {
         board[i][j]='B';
         for(int k=0;k<8;++k)
       {
        int x=i+dx[k],y=j+dy[k];
        if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='E') dfs(board,x,y);
       }
       }
    }
};

七、衣柜整理

. - 力扣(LeetCode)

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记

class Solution {
public:
    bool vis[100][100];
    int m,n,cnt;
    int ret;
    int wardrobeFinishing(int _m, int _n, int _cnt) 
    {
       m=_m,n=_n,cnt=_cnt;
       ret=0;//统计符合要求的各自的数目
       dfs(0,0);
       return ret;
    }
    void dfs(int i,int j)
    {   
        ++ret;
        vis[i][j]=true;
        if(j+1<n&&check(i,j+1)&&!vis[i][j+1]) dfs(i,j+1);//向右找
        if(i+1<m&&check(i+1,j)&&!vis[i+1][j]) dfs(i+1,j);//向下找
    }
    bool check(int i,int j)
    {
        int temp=0;
        while(i)
        {
            temp+=(i%10);
            i/=10;
        }
        while(j)
        {
            temp+=(j%10);
            j/=10;
        }
        return temp<=cnt;
    }
};

DFS:floodfill算法解决矩阵联通块问题,递归、搜索与回溯算法总结,深度优先,算法,leetcode,c++,笔记文章来源地址https://www.toymoban.com/news/detail-852296.html

到了这里,关于DFS:floodfill算法解决矩阵联通块问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DFS:从递归去理解深度优先搜索

    . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode)  1、迭代 2、递归  

    2024年04月17日
    浏览(45)
  • 【算法详解 | DFS算法】深度优先搜索解走迷宫问题 | 深度优先图遍历

    by.Qin3Yu 本文需要读者掌握 结构体 和 栈 的操作基础,完整代码将在文章末尾展示。 特别声明:本文为了尽可能使用简单描述,以求简单明了,可能部分专有名词定义不准确。 栈相关操作可以参考我的往期博文: 【C++数据结构 | 栈速通】使用栈完成十进制数转二四八进制数

    2024年02月03日
    浏览(41)
  • 递归算法学习——N皇后问题,单词搜索

    目录 ​编辑 一,N皇后问题 1.题意 2.解释 3.题目接口 4.解题思路及代码 二,单词搜索 1.题意 2.解释 3.题目接口 4.思路及代码 1.题意 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题  研究的是如何将  n  个皇后放置在  n×n  的

    2024年02月09日
    浏览(26)
  • 「算法小记」-2:矩阵链相乘的方案数【迭代/递归/动态规划/区域化DP/记忆化搜索】(C++ )

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《算法小记》系列专栏,该专栏记录了许

    2024年02月05日
    浏览(40)
  • BFS算法(宽度优先搜索)超强解析 BFS迷宫问题图文详解 DFS与BFS的区别

      前情回顾:DFS练习-迷宫(最短路径)问题详解 一波三折 图片+文字 以及你需要会的基础:手搓数据结构之队列queue C/C++语言版(BFS算法预备知识) 广度优先搜索(Breadth First Search)简称广搜或者 BFS, 是遍历图存储结构的一种算法 。 BFS的原理是 “逐层扩散” ,从起点出发

    2024年02月22日
    浏览(38)
  • 图论问题建模和floodfill算法

    目录 引入:leetcode695.岛屿的最大面积 分析与转换 一维二维转换 四联通 完整代码解答:  1)显示的创建图解决问题的代码 2)不显示的创建图解决此问题的代码 floodfill算法 定义 在题目中0是海水,1是陆地。在我们自己设定的图中假设蓝色是海水,红色是陆地。且每一个小格

    2024年02月06日
    浏览(29)
  • 递归实现 组合问题+排列问题(DFS)

    目录 递归实现排列型枚举 递归实现排列类型枚举 II  递归实现组合型枚举 递归实现组合型枚举 II 递归实现指数型枚举 递归实现指数型枚举 II 递归不是循环,递归利用了系统栈,只要是函数都会被系统管理。当执行到函数地址入口时就会为函数在系统栈上分配一块内存。当

    2024年02月15日
    浏览(31)
  • 算法沉淀——BFS 解决 FloodFill 算法(leetcode真题剖析)

    BFS(广度优先搜索)解决 Flood Fill 算法的基本思想是通过从起始点开始,逐层向外扩展,访问所有与起始点相连且具有相同特性(颜色等)的区域。在 Flood Fill 中,通常是通过修改图像的像素颜色。 下面是 BFS 解决 Flood Fill 算法的步骤: 初始化: 将起始点的颜色修改为新的

    2024年02月20日
    浏览(30)
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径

    题目描述 在一个遥远的国度里,存在一个神秘的魔法森林,传说中森林深处隐藏着一个古老的宝藏。这个宝藏只能通过找到森林中最长的“递减魔法路径”来解锁。这个路径由一系列魔法石组成,每个魔法石刻有不同的数字,代表着它们的魔力强度。要找到宝藏,探险者必须

    2024年02月02日
    浏览(30)
  • 【数据结构】迷宫问题DFS非递归(c语言实现)

    本来之前写过一个推箱子,就想着写个迷宫游戏,因为想着推箱子游戏里面也有墙,也有玩家的移动,比推箱子简单的是还不用判断前面是否有箱子的情况,但是自己写的迷宫游戏如果自己随机生成的迷宫地图的话,不一定会有通路,他要学一个什么随机迷宫的生成,刚看完

    2024年02月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包