当前位置: 首页 > news >正文

【算法专题十四】BFS解决FloodFill算法

文章目录

  • 1.简介
  • 2.图像渲染
    • 2.1 题目
    • 2.2 思路
    • 2.3代码
  • 3.岛屿数量
    • 3.1 题目
    • 3.2 思路
    • 3.3 代码
  • 4.岛屿的最大面积
    • 4.1 题目
    • 4.2 思路
    • 4.3 代码
  • 5. 被围绕的区域
    • 5.1 题目
    • 5.2 思路
    • 5.3 代码

1.简介

在这里插入图片描述

2.图像渲染

2.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 思路

在这里插入图片描述
在这里插入图片描述

2.3代码

class Solution {
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {int prev = image[sr][sc];if(prev == color) return image; // 判断边界条件queue<pair<int, int>> q;q.push({sr, sc});int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m = image.size(), n = image[0].size();while(q.size()){auto [a, b] = q.front();q.pop();image[a][b] = color;for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i]; if(x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev) q.push({x, y});}}     return image;}
};

3.岛屿数量

3.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

3.2 思路

在这里插入图片描述
在这里插入图片描述

3.3 代码

class Solution {
public:bool vis[301][301];int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};int m, n;int numIslands(vector<vector<char>>& grid) {int ret = 0;m = grid.size(), n = grid[0].size();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == '1' && !vis[i][j]){ret += 1;bfs(grid, i, j); // 把这块陆地都标记一下;}}} return ret;}void bfs(vector<vector<char>>& grid, int i, int j){queue<pair<int, int>> q;q.push({i, j});vis[i][j] = true;while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !vis[x][y]){q.push({x, y});vis[x][y] = true;}}}}
};

4.岛屿的最大面积

4.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

4.2 思路

在这里插入图片描述
在这里插入图片描述

4.3 代码

class Solution {
public:int m, n;bool vis[51][51];int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0}; int ret;int maxAreaOfIsland(vector<vector<int>>& grid) {m = grid.size(), n = grid[0].size();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == 1 && !vis[i][j]){int ret2 = bfs(grid, i, j);ret = max(ret, ret2);}}}return ret;}int bfs(vector<vector<int>>& grid, int i, int j){queue<pair<int, int>> q;q.push({i, j});vis[i][j] = true;int ret1=1;while(q.size()){auto [a, b] = q.front();q.pop();for(int ii = 0; ii < 4; ii++){int x = a + dx[ii], y = b + dy[ii];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y]){q.push({x, y});ret1 ++;vis[x][y] = true;}}}return ret1;}
};

5. 被围绕的区域

5.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

5.2 思路

在这里插入图片描述
在这里插入图片描述

5.3 代码

class Solution {
public:int m, n;// bool vis[201][201];// 因为这个题可以直接在原数组上修改,所以就不用vis数组了int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};void solve(vector<vector<char>>& board) {m = board.size(), n = board[0].size();// 1.先把边缘的0变成.for(int i = 0; i < m; i++){if(board[i][0] == 'O') bfs(board, i, 0);if(board[i][n - 1] == 'O') bfs(board, i, n - 1);}for(int j = 0; j < n; j++){if(board[0][j] == 'O') bfs(board, 0, j);if(board[m - 1][j] == 'O') bfs(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';if(board[i][j] == '.') board[i][j] = 'O';}}}void bfs(vector<vector<char>>& board, int i, int j){queue<pair<int, int>> q;q.push({i, j});board[i][j] = '.';while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O'){board[x][y] = '.';q.push({x, y});}}}}
};
http://www.dtcms.com/a/199998.html

相关文章:

  • Web前端开发:@media(媒体查询)
  • 解决使用@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss“, timezone = “GMT+8“)时区转换无效的问题
  • 测试开发面试题:Python高级特性通俗讲解与实战解析
  • 5个开源MCP服务器:扩展AI助手能力,高效处理日常工作
  • 永磁同步电机高性能控制算法(22)——基于神经网络的转矩脉动抑制算法为什么低速时的转速波动大?
  • JavaScript 系列之:数组、树形结构等操作
  • Android设备 显示充电速度流程
  • 掌握Git:版本控制与高效协作指南
  • netcore项目使用winforms与blazor结合来开发如何按F12,可以调出chrome devtool工具辅助开发
  • 深入浅出IIC协议 -- 第二篇:FPGA数字接口设计方法论
  • 基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例
  • Flutter 中的 async/await 和 Future
  • 全能视频处理工具介绍说明
  • 大语言模型 12 - 从0开始训练GPT 0.25B参数量 MiniMind2 补充 训练开销 训练步骤 知识蒸馏 LoRA等
  • JavaScript 性能优化实战指南
  • 《JVM如何判断一个对象可以被回收?图文详解GC Root算法》
  • 深度解析:Redis 性能优化全方位指南
  • Python操作PDF书签详解 - 添加、修改、提取和删除
  • AI量化交易是什么?它是如何重塑金融世界的?
  • 如何评估开源商城小程序源码的基础防护能力?
  • 蓝桥杯2300 质数拆分
  • 四:操作系统cpu调度之调度算法
  • JVM类加载机制
  • Java设计模式之桥接模式:从入门到精通
  • 1-3V升3.2V升压驱动WT7013
  • 利用ffmpeg截图和生成gif
  • esp32课设记录(四)摩斯密码的实现 并用mqtt上传
  • fnOS手机APP+NAS架构:破解跨地域数据实时访问的内网穿透难题
  • 5月19日笔记
  • lammps后处理:堆垛层错和孪晶的数量统计