FloodFill 算法(DFS)

文章目录

  • FloodFill 算法(DFS)
    • 图像渲染
    • 岛屿数量
    • 岛屿的最大面积
    • 被围绕的区域
    • 太平洋大西洋水流问题
    • 扫雷游戏
    • 衣橱整理

FloodFill 算法(DFS)

漫水填充(Flood Fi)算法是一种图像处理算法,在计算机图形学和计算机视觉中被广泛应用。它用于填充图像中的连通区域,从一个种子点开始,沿着相邻的像素进行填充操作,直到达到某个停止条件为止。该算法可以实现图像填充、颜色替换、图像分割等操作。

图像渲染

题目:图像渲染

在这里插入图片描述

思路

从起点开始深度优先搜索,当遇到上下左右和当前一样时,即为合法目标,将其修改为color,用一个标记数组visited来判断当前位置是否访问过

C++代码

class Solution 
{bool visited[51][51];int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0}; int m, n;int prev;
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {if(image[sr][sc] == color) return image;m = image.size(), n = image[0].size();prev = image[sr][sc];visited[sr][sc] = true;dfs(image, sr, sc, color);visited[sr][sc] = false;return image;}void dfs(vector<vector<int>>& image, int i, int j, int color){image[i][j] = color;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(0 <= x && x < m && 0 <= y && y < n && !visited[x][y] && image[x][y] == prev){visited[x][y] = true;dfs(image, x, y, color);visited[x][y] =false;}}}
};

岛屿数量

题目:岛屿数量

在这里插入图片描述
思路

遍历数组,找到1开始搜索,搜索一次答案++,遍历过后用一个标记数组visited标记该位置

C++代码

class Solution 
{int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m, n;bool visited[301][301];
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(!visited[i][j] && grid[i][j] == '1'){ret++;dfs(grid, i, j);}}return ret;}void dfs(vector<vector<char>>& grid, int i, int j){visited[i][j] = true;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(0 <= x && x < m && 0 <=y && y < n && !visited[x][y] && grid[x][y] == '1'){dfs(grid, x, y);}}}
};

岛屿的最大面积

题目:岛屿的最大面积

在这里插入图片描述
思路

岛屿数量解题思路一样,只不过在每次遍历岛屿的时候,用一个变量count来统计当前岛屿的大小,并变量完当前岛屿后,和之前最大的结果ret取一个最大值

C++代码

class Solution 
{bool visited[51][51];int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m, n;int count;
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(!visited[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){visited[i][j] = true;count++;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(0 <= x && x < m && 0 <=y && y < n && !visited[x][y] && grid[x][y] == 1){dfs(grid, x, y);}}}
};

被围绕的区域

题目:被围绕的区域

在这里插入图片描述
思路

岛屿数量解题思路一样,只不过在每次遍历岛屿的时候,用一个变量count来统计当前岛屿的大小,并变量完当前岛屿后,和之前最大的结果ret取一个最大值

C++代码

class Solution 
{int dx[4] = {0,0,1,-1};int dy[4] = {-1,1,0,0};int m, n;
public: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 i = 1; i < n - 1; i++){if(board[0][i] == 'O') dfs(board, 0, i);if(board[m - 1][i] == 'O') dfs(board, m - 1, i);}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';                 }}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(0 <= x && x < m && 0 <= y && y < n && board[x][y] == 'O'){dfs(board, x, y);}}}
};

太平洋大西洋水流问题

题目:太平洋大西洋水流问题

在这里插入图片描述
思路

  • 对于太平洋边界(即第一行和第一列)上的每个单元格,将其标记为可达太平洋toPO = true,并将其加入队列进行DFS。在DFS过程中,如果当前单元格的相邻单元格高度不低于当前单元格,且未被标记为可达太平洋,则将其标记为可达太平洋,并加入队列继续搜索
  • 对于大西洋边界(即最后一行和最后一列)上的每个单元格,进行类似的操作,将其标记为可达大西洋toAO= true
  • 遍历整个矩阵,对于每个单元格,如果它同时被标记为可达太平洋和可达大西洋toPO && toAO,则将其坐标加入结果列表。

C++代码

class Solution 
{int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m, n;bool toPO[201][201];bool toAO[201][201];vector<vector<int>> ret;
public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m = heights.size(), n = heights[0].size();// 左、上for(int i = 0; i < m; i++) dfs(heights, i, 0, toPO);for(int i = 0; i < n; i++) dfs(heights, 0, i, toPO);// 右、下for(int i = 0; i < m; i++) dfs(heights, i, n - 1, toAO);for(int i = 0; i < n; i++) dfs(heights, m - 1, i, toAO);for(int i = 0; i < m; i++)for(int j = 0; j < n; j++)if(toPO[i][j] && toAO[i][j]) ret.push_back({i, j});return ret;}void dfs(vector<vector<int>>& heights, int i, int j, bool visited[201][201]){visited[i][j] = true;for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(0 <= x && x < m && 0 <= y && y < n && !visited[x][y] && heights[x][y] >= heights[i][j])dfs(heights, x, y, visited);}}
};

扫雷游戏

题目:扫雷游戏

在这里插入图片描述
思路

理解题目意思,模拟+深度优先搜索

C++代码

class Solution
{int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1};int dy[8] = {1, -1, 0, 1, -1, 0, 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(0 <= x && x < m && 0 <= y && y < n && board[x][y] == 'M'){count++;}}// 周围有地雷if(count){board[i][j] = count + '0';return;}else{board[i][j] = 'B';for(int k = 0; k < 8; k++){int x = i + dx[k], y = j + dy[k];if(0 <= x && x < m && 0 <= y && y < n && board[x][y] == 'E'){dfs(board, x, y);}}            }}
};

衣橱整理

题目:衣橱整理

在这里插入图片描述

思路

模拟+DFS

C++代码

class Solution 
{int ret;bool vis[101][101];int dx[4] = {0, 1};int dy[4] = {1, 0};int m, n, cnt;
public:int wardrobeFinishing(int _m, int _n, int _cnt) {m = _m, n = _n, cnt = _cnt;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 i,int j){int tmp = 0;while(i){tmp += i % 10;i /= 10;}while(j){tmp += j % 10;j /= 10;}return tmp <= cnt;}
};

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

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

相关文章

阿里开源Multi-(llm)Agent应用框架: Agentscope探究与学习

1. 架构图 2. 核心概念 Core Concepts 2.1 Message&#xff08;消息&#xff09; 是信息的载体&#xff08;例如指令、多模态数据和对话内容&#xff09;。在AgentScope中&#xff0c;消息是Python字典的子类&#xff0c; 具有name和content作为必要字段&#xff0c;url作为可…

[项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 | scp

目录 一、前言 二、项目的相关背景 三、搜索引擎的宏观原理 四、搜索引擎技术栈和项目环境 五、正排索引 VS 倒排索引--原理 正排索引 分词 倒排索引 六、编写数据去除标签和数据清洗模块 Parser 1.数据准备 parser 编码 1.枚举文件 EnumFile 2.去标签ParseHtml(…

【CSS in Depth 2 精译_048】7.2 CSS 响应式设计中的媒体查询原则(中):页面断点(breakpoint)样式的添加

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第七章 响应式设计】&#xff08;概述&#xff09; 7.1 移动端优先设计原则&#xff08;上篇&#xff09; 7.1.1 创建移动端菜单&#xff08;下篇&#xff09;7.1.2 给视口添加 meta 标签&#xf…

「数学::快速幂」矩阵快速幂运算|快速斐波那契数列 / LeetCode 509(C++)

目录 概述 思路 算法过程 复杂度 Code 概述 LeeCode 509&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff…

linux--库指令

ldd ldd 可执行文件路径 显示依赖的库的查找路径以及是否查找到了。

Request2:Post请求和Json

百度翻译拿到自己想看的数据&#xff0c;下图查看请求到数据的请求 preview提前看下 取出对应的RequestUrl &#xff0c;看出来要使用的话得用post请求 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json if __name__ "__main__":#1.指定…

SAP物料凭证报表字段调整

业务场景&#xff1a; 报表MB51的输入和输出字段调整&#xff1a; 输入&#xff08;选择界面&#xff09; 输出界面 可以看到在这是没有布局调整的 后台路径&#xff1a; SPRO-物料管理-库存管理和实际库存-报表-定义物料凭证列表的字段选择 事务码&#xff1a;SM30-V_MMI…

FPGA学习(6)-基础语法参数化设计阻塞与非阻塞

目录 1.两种参数化不改变源文件&#xff0c;只改仿真文件的值 2.参数化设计实现模块的重用 2.1不用参数化方法 2.1.1源文件 2.1.2仿真文件 2.1.3仿真波形及实验 2.2 用参数方法 2.2.1调用之前写的led灯闪烁模块&#xff0c;在本源函数中&#xff0c;例化4次调用之前的模…

史上最烂 spring transaction 原理分析

史上最烂 spring transaction 原理分析 事务定义、事务作用、事务特性、生命周期、数据库事务三种运行模式、数据库事务控制、并发事务问题、隔离级别、数据库事务实现原理、spring 事务传播行为、spring 事务核心组件、spring boot 事务相关组件、事务嵌套原理、编程式事务与声…

51单片机的万年历【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块时钟模块按键蜂鸣器等模块构成。适用于电子万年历、数字时钟万年历等相似项目。 可实现功能: 1、LCD1602实时显示年月日星期和北京时间&#xff0c;具备闰年判断功能 2、按键可设置闹钟时间 3、按键可修改当前时…

[Halcon矩阵] 通过手眼标定矩阵计算相机旋转角度

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

06.队列介绍+实现

目录 一、队列的概念 二、队列的实现 1、头文件定义 2、功能函数实现 3、主函数测试 一、队列的概念 队列就像吃饭排队类似&#xff0c;先来先吃&#xff0c;先进先出。 队头&#xff1a;队列的头部。 队尾&#xff1a;队列的尾部。 入队&#xff1a;在队尾操作。 出队&…

STM32—BKP备份寄存器RTC实时时钟

1.BKP简介 BKP(Backup Registers)备份寄存器BKP可用于存储用户应用程序数据。当VDD&#xff08;2.0~3.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒&#xff0c;或系统复位或电源复位时&#xff0c;他们也不会被复位TAMP…

【GAMES101笔记速查——Lecture 16 Ray Tracing4】

上节课的内容&#xff1a;辐射度量学、光线传播、反射方程、渲染方程、全局光照、概率论复习 这节课要介绍一种真实的渲染方法-蒙特卡洛路径追踪 目录 1 简单回顾 1.1 渲染方程&#xff08;The Rendering Equation&#xff09; 1.2 概率 2 蒙特卡洛积分&#xff08;Monte…

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是可控的&#xff0c;并且参数会带入到数据库中执行&#xff0c;导致…

(10) GTest c++单元测试(mac版)

文章目录 概要安装实现机制-断言&#xff08;简单、独立的测试&#xff09;实现机制-测试套件实现机制-Test Fixture和事件 概要 官方文档 https://google.github.io/googletest/ 安装 git clone https://github.com/google/googletestcd googletestmkdir build && c…

数字化营销助企业在生态平台实现内卷突围

在当今数字化时代&#xff0c;企业竞争激烈&#xff0c;内卷化严重。而数字化生态平台建设与数字化营销为企业带来了新机遇。 数字化生态平台意义重大。它能整合企业内外资源&#xff0c;提高运营效率。打破地域限制&#xff0c;拓展市场&#xff0c;吸引更多客户。还能为企业创…

【AI副业项目】太离谱了!爆涨粉47W+,下一个风口项目AI+大健康养S赛道,单月变现30W,教你如何用AI做爆款健康养生账号

我一直说小红薯平台是最适合新手素人做的平台&#xff0c;去中心化的平台&#xff0c;任何普通人都可以在这个平台分一杯羹的平台。 但但但是很多朋友发小红薯作品都是超低的小眼睛&#xff0c;连最基本的流量都没拿到。 从他们的经历来看就是小红薯太难做了。那是没有掌握技…

【Vue】Vue3.0 (十二)、watchEffect 和watch的区别及使用

上篇文章&#xff1a; 【Vue】Vue3.0 &#xff08;十二&#xff09;、watch对ref定义的基本类型、对象类型&#xff1b;reactive定义的对象类型的监视使用 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&…

智慧油田智能安全管控方案-AI助力油气田安全管控升级

在科技日新月异的今天&#xff0c;万物纵横科技凭借其前沿的智慧油田智能安全管控方案&#xff0c;正引领着油气田行业向智能化、高效化转型。该方案深度融合了AI视频智能分析与AIoT&#xff08;物联网人工智能&#xff09;技术&#xff0c;为采油场、油气场的设备运维、环境监…