leetcode算法题之floodfill算法---深搜(dfs)

本章目录

  • 1.图像渲染
  • 2.岛屿数量
  • 3.岛屿的最大面积
  • 4.被围绕的区域
  • 5.太平洋大西洋水流问题
  • 6.扫雷游戏
  • 7.机器人的运动范围

1.图像渲染

图像渲染
在这里插入图片描述

class Solution {int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int newColor,prev;int m,n;
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {newColor = color;prev = image[sr][sc];if(color == image[sr][sc]) return image;m = image.size(),n = image[0].size();dfs(image,sr,sc);return image;}void dfs(vector<vector<int>>& image,int i,int j){image[i][j] = newColor;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);}}}
};

2.岛屿数量

岛屿数量
在这里插入图片描述

class Solution {int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};bool vis[301][301];int m,n;
public:int numIslands(vector<vector<char>>& 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(!vis[i][j] && grid[i][j] == '1'){ret++;dfs(grid,i,j);//把这块区域都标记成已访问}}}return ret;}void dfs(vector<vector<char>>& grid,int i,int j){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]&& grid[x][y] == '1'){dfs(grid,x,y);}}}
};

3.岛屿的最大面积

岛屿的最大面积
在这里插入图片描述

class Solution {int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int m,n,count;bool vis[51][51];
public: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(!vis[i][j] && grid[i][j] == 1){count = 0;dfs(grid,i,j);ret = max(ret,count);}}}return ret;}void dfs(vector<vector<int>>& grid, int i,int j){count++;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]&& grid[x][y] == 1){dfs(grid,x,y);}}}
};

4.被围绕的区域

被围绕的区域
在这里插入图片描述

class Solution {int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int m,n;
public:
//正难则反:先处理与边缘'O'相连的连通块void solve(vector<vector<char>>& board) {m = board.size(),n = board[0].size();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);}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++){for(int j=0;j<n;j++){if(board[i][j] == 'O') board[i][j] = 'X';else if(board[i][j] == '.') board[i][j] = 'O';}}}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);}}}
};

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

太平洋大西洋水流问题
在这里插入图片描述

class Solution {
//正难则反:求出哪些点能流进太平洋,哪些点能流进大西洋,在求之间的交集即可int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int m,n;vector<vector<bool>> pac;vector<vector<bool>> alt;vector<vector<int>> ret;
public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m = heights.size(),n = heights[0].size();pac = vector<vector<bool>>(m,vector<bool>(n));alt = vector<vector<bool>>(m,vector<bool>(n));for(int i=0;i<m;i++){dfs(heights,i,0,pac);dfs(heights,i,n-1,alt);}for(int j=0;j<n;j++){dfs(heights,0,j,pac);dfs(heights,m-1,j,alt);}//判断for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(pac[i][j] && alt[i][j]){ret.push_back({i,j});}}}return ret;}void dfs(vector<vector<int>>& heights,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] && heights[x][y]>=heights[i][j]){dfs(heights,x,y,vis);}}}
};

6.扫雷游戏

扫雷游戏
在这里插入图片描述

class Solution {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;
public: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';return board;}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] = count +'0';return;}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);}}}
};

7.机器人的运动范围

机器人的运动范围
在这里插入图片描述

class Solution {int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int m,n,k;int ret =0;bool vis[101][101];
public:
//从(0,0)点,进行一次深度优先遍历即可int movingCount(int _k, int _m, int _n) {k = _k,m=_m,n=_n;dfs(0,0);return ret;}void dfs(int i,int j){ret++;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]&& check(x,y)){dfs(x,y);}}}bool check(int x,int y){int tmp = 0;while(x){tmp += x%10;x /= 10;}while(y){tmp += y%10;y /= 10;}return tmp<=k;}
};

这个系列就到处结束啦,希望对大家有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/328929.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】带你学会使用C++线程库thread、原子库atomic、互斥量库mutex、条件变量库condition_variable

C线程相关知识讲解 前言正式开始C官方为啥要提供线程库thread构造函数代码演示this_threadget_id()yield()sleep_until和sleep_for mutex构造函数lock和unlock上锁全局锁局部锁lambda表达式 try_lock 其他锁时间锁递归版本专用锁recursive_mutex 锁的异常处理lock_guardunique_…

redis可视化工具 RedisInsight

redis可视化工具 RedisInsight 1、RedisInsight是什么2、下载RedisInsight3、使用RedisInsight4、其他redsi可视化工具 1、RedisInsight是什么 RedisInsight 是一个用于管理和监控 Redis 数据库的图形用户界面&#xff08;GUI&#xff09;工具。它是由 Redis Labs 开发的&…

IIS+SDK+VS2010+SP1+SQL server2012全套工具包及安装教程

前言 今天花了两个半小时安装这一整套配置&#xff0c;这个文章的目标是将安装时间缩短到1个小时 正文 安装步骤如下&#xff1a; VS2010 —> service pack 1 —>SQL server2012 —> IIS —> SDK 工具包链接如下&#xff1a; https://pan.baidu.com/s/1WQD-KfiUW…

python实现windows内存看门狗程序(带GUI界面)

python实现windows内存看门狗程序&#xff08;带GUI界面&#xff09; 效果图 1、程序核心 看门狗程序核心&#xff1a; 1、运行特定程序任务进程 2、监控任务管理器上的内存使用率 3、如果超过阈值则关闭该特定程序进程 4、重新开启该特定程序 5、重复过程2持续监控2、程序流…

三种主流流协议的浏览器播放解决方案

三种主流流协议的浏览器播放解决方案 流协议介绍 主流的流协议&#xff08;streaming protocol&#xff09;包括HLS、RTMP、RTSP&#xff0c;下面依次介绍下三种视频流。 HLS HLS&#xff08;Http Live Streaming) 是一个由苹果公司提出的基于HTTP的流媒体网络传输协议&…

【前端设计】文字聚光灯

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…

【霹雳吧啦】手把手带你入门语义分割の番外12:U2-Net 源码讲解(PyTorch)—— 网络的搭建

目录 前言 Preparation 一、U2-Net 网络结构图 二、U2-Net 网络源代码 1、model.py &#xff08;1&#xff09;ConvBNReLU 类 &#xff08;2&#xff09;DownConvBNReLU 类 &#xff08;3&#xff09;UpConvBNReLU 类 &#xff08;4&#xff09;RSU 类 & RSU4F 类…

并发(5)

目录 26.说说final类型的类如何扩展&#xff1f; 27.final方法可以被重载吗&#xff1f; 28.父类的final方法能不能被子类重写&#xff1f; 29.说说基本类型的final域重排序规则&#xff1f; 30.说说final的原理&#xff1f; 26.说说final类型的类如何扩展&#xff1f; 比…

IDEA 每次新建工程都要重新配置 Maven的解决方案

文章目录 IDEA 每次新建工程都要重新配置 Maven 解决方案一、选择 File -> New Projects Setup -> Settingsfor New Projects…二、选择 Build,Execution,Deployment -> Build Tools -> Maven IDEA 每次新建工程都要重新配置 Maven 解决方案 DEA 每次新建工程都要…

STM32之模拟IIC总线控制SHT20温湿度芯片

一、IIC总线概述 1、IIC总线介绍 I2C (Inter&#xff0d;Integrated Circuit)总线产生于在80年代&#xff0c; 由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备, 最初为音频和视频设备开发。I2C总线两线制包括&#xff1a;串行数据SDA&#xff08…

基于JAVA的服装店库存管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

大数据分析案例-基于LinearRegression回归算法构建房屋价格预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…