[Lc5_dfs+floodfill] 簡介 | 圖像渲染 | 島嶼數量

目錄

0.floodfill算法簡介

1.圖像渲染

題解

2.島嶼數量

題解


之前我們在 bfs 中有介紹過[Lc15_bfs+floodfill] 圖像渲染 | 島嶼數量 | 島嶼的最大面積 | 被圍繞的區域,現在我們來看看 dfs 又是如何解決的呢

0.floodfill算法簡介

floodfill算法又叫洪水灌溉或者洪水淹沒

  • 比如有一個區域,負數表示低谷,0表示平原,正數表示山峰。
  • 此時發大水把這些區域淹了。其中平原和山峰可能不會改變,但是低谷水位就要上升。
  • 這種類型題目就是,我們要在這個區域中找出水位會上升的區域或者說找到會被洪水淹的區域。

其實這道題說白了就是把 性質相同的一個連通塊 找出來

比如這里就是把所有是負數的連通塊找到,注意只能上下左右相連,斜著不能連!

floodfill算法解決的問題就這么簡單,它解決方法也非常簡單

  • 可以用深度優先遍歷和寬度優先遍歷。
  • dfs就是一條路走到黑,如果無法走就回溯到上一層,然后能走就繼續走,直到走到一個不能走的位置。(上下左右就是每層的選擇,走到葉子節點的時候就找到連通塊啦~)

此時就把一個連通區域找到了。

bfs從一個位置開始把和我相連的位置加入到隊列里,然后繼續在擴一層在擴一層…

  • 因此floodfill算法有兩種解決方式,要么dfs、要么bfs。
  • 你會發現這個dfs和我們前面單詞搜索,黃金礦工解法非常相似,到一個位置之后就上下左右掃描,當和我性質相同就遞歸進去。

這里主要用的是dfs。bfs在前面的優選算法里面,本質其實就是暴搜。


1.圖像渲染

鏈接:733. 圖像渲染

有一幅以 m x n 的二維整數數組表示的圖畫 image ,其中 image[i][j] 表示該圖畫的像素值大小。你也被給予三個整數 sr , sccolor 。你應該從像素 image[sr][sc] 開始對圖像進行上色 填充

為了完成 上色工作

  1. 從初始像素開始,將其顏色改為 color
  2. 對初始坐標的 上下左右四個方向上 相鄰且與初始像素的原始顏色同色的像素點執行相同操作。
  3. 通過檢查與初始像素的原始顏色相同的相鄰像素并修改其顏色來繼續 重復 此過程。
  4. 沒有 其它原始顏色的相鄰像素時 停止 操作。

最后返回經過上色渲染 修改 后的圖像 。


題解

題目說這么多,其實就是給一個矩陣,在給一個初始的坐標,然后把和這小格性質相同的連通塊找到然后變成newcolor。注意只能上下左右去找!

  • 關于題目的詳細解釋,可以去的 BFS 相應文章中查看
class Solution {
public:
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int m,n,ret,_color;vector<vector<int>> floodFill
(vector<vector<int>>& image, int sr, int sc, int color) 
{m=image.size();n=image[0].size();ret=image[sr][sc];image[sr][sc]=color;_color=color;if(ret==color) return image; //!!!!邊界dfs(image,sr,sc);return image;
}void dfs(vector<vector<int>>& image, int i, int 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&& image[x][y]==ret){image[x][y]=_color;dfs(image,x,y);}}
}
};

if(ret==color) return image; //!!!!開始前,處理邊界


2.島嶼數量

鏈接:200. 島嶼數量

給你一個由 '1'(陸地)和 '0'(水)組成的的二維網格,請你計算網格中島嶼的數量。

島嶼總是被水包圍,并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。

此外,你可以假設該網格的四條邊均被水包圍。

示例 1:

輸入:grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]
]
輸出:1

題解

這道題讓找到由陸地構成的島嶼的數量,也就是讓找到性質相同的連通塊數量。

  • 注意只能上下左右找。
  • 1代表陸地,0代表水域。

我們一行一行掃描

  • 掃描到第一個1的時候,我就把以這個1相連的所有為1的區域都標記一下
  • 相當于找到了一塊島嶼記錄一下。
  • 接下來繼續掃描。但是有可能會碰到重復的情況,因此這里需要一個bool類型的數組 標記當前位置是否被找過。
  • 或者可以修改原始值把它由1變成0。這里我們還用的是老方法bool類型數組。

之前走過下一就不能在走了。

class Solution {
public:int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int ret=0,m,n;vector<vector<bool>> check;int numIslands(vector<vector<char>>& grid) {m=grid.size();n=grid[0].size();check.resize(m,vector<bool>(n,false));for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(!check[i][j] && grid[i][j]=='1'){check[i][j]=true;ret++;dfs(grid,i,j);}}}return ret;}void dfs(vector<vector<char>>& grid,int i,int 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&& !check[x][y] &&grid[x][y]=='1'){check[x][y]=true;dfs(grid,x,y);}}} 
};
  • 一,這里的 grid 里是 char('1')
  • 二,要注意一下無論是起始,還是結束都要對 check 進行一個判斷,來防止進入死循環

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899575.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM類加載器詳解

文章目錄 1.類與類加載器2.類加載器加載規則3.JVM 中內置的三個重要類加載器為什么 獲取到 ClassLoader 為null就是 BootstrapClassLoader 加載的呢&#xff1f; 4.自定義類加載器什么時候需要自定義類加載器代碼示例 5.雙親委派模式類與類加載器雙親委派模型雙親委派模型的執行…

Chapters 15 16:What Is Architecture?Independence_《clean architecture》notes

What Is Architecture?&Independence **Chapter 15: What Is Architecture?****Key Concepts**:**Code Example: Layered Architecture**: **Chapter 16: Independence****Key Concepts**:**Code Example: Dependency Inversion & Interfaces**: **Combined Example:…

【SPP】RFCOMM 層在SPP中互操作性要求深度解析

藍牙串口協議&#xff08;SPP&#xff09;通過 RFCOMM 協議實現 RS232 串口仿真&#xff0c;其互操作性是設備互聯的關鍵。本文基于藍牙核心規范&#xff0c;深度解析 RFCOMM 層的能力矩陣、信號處理、流控機制及實戰開發&#xff0c;結合狀態機、流程圖和代碼示例&#xff0c;…

阻塞式IO與非阻塞IO的區別

阻塞式IO與非阻塞IO的區別 1. 阻塞式IO (Blocking I/O) 定義 當程序發起一個I/O操作&#xff08;如讀取文件、網絡數據&#xff09;時&#xff0c;進程會被掛起&#xff08;阻塞&#xff09;&#xff0c;直到操作完成或超時才會繼續執行后續代碼。在此期間&#xff0c;程序無法…

Gossip協議:分布式系統中的“八卦”傳播藝術

目錄 一、 什么是Gossip協議&#xff1f;二、 Gossip協議的應用 &#x1f4a1;三、 Gossip協議消息傳播模式詳解 &#x1f4da;四、 Gossip協議的優缺點五、 總結&#xff1a; &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&…

【C++初階】----模板初階

1.泛型函數 泛型編程&#xff1a;編寫與類型無關的通用代碼&#xff0c;是代碼復用的一種手段。模板是泛型編程的基礎。 2.函數模板 2.1函數模板的概念 函數模板代表了一個函數家族&#xff0c;該函數模板與類型無關&#xff0c;在使用時被參數化&#xff0c;根據實參類型…

git-- github的使用--賬戶和本地連接

以下指令在git 執行bash 流程&#xff1a;先看有沒有密鑰&#xff1b; 沒有的話&#xff0c;在電腦生成密鑰對&#xff0c;公鑰復制到github&#xff1b; 要想使用https&#xff0c;配置令牌&#xff0c;注意令牌有期限問題&#xff0c;連接不了有可能是期限問題 一個電腦對…

OTN(Optical Transport Network)詳解

OTN&#xff08;光傳送網&#xff09;是一種基于**波分復用&#xff08;WDM&#xff09;**的大容量光傳輸技術&#xff0c;結合了SDH的運維管理優勢和WDM的高帶寬特性&#xff0c;廣泛應用于骨干網、城域核心層及數據中心互聯&#xff08;DCI&#xff09;。 1. OTN 的基本概念 …

Python 中列表(List)、元組(Tuple)、集合(Set)和字典(Dict)四大數據結構的完整對比

以下是 Python 中列表&#xff08;List&#xff09;、元組&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;和字典&#xff08;Dict&#xff09;四大數據結構的完整對比分析&#xff0c;結合了核心特性、操作方式和應用場景的深度總結&#xff1a; 一、核心特性…

Angular由一個bug說起之十五:自定義基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一個常見的 UI 組件&#xff0c;用于在用戶與頁面元素交互時提供額外的信息。由于angular/material/tooltip的matTooltip只能顯示純文本&#xff0c;所以我們可以通過自定義Directive來實現一個靈活且功能豐富的tooltip Overlay…

軟件工程面試題(十五)

1、servlet 創建過程以及ruquest,response,session的生命周期? Servlet的創建過程: 第一步 public class AAA extends HttpServlet{ 實現對應的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…

搭建QNX Software Center的Docker環境

背景 本人使用 Ubuntu Server 22.04 服務器&#xff0c;所以沒有圖形界面&#xff0c;而 QNX Software Center 需要圖形界面。為了保證服務器環境的整理&#xff0c;計劃使用Docker部署QNX Software Center 一瓶安裝圖形界面。本方既是實現方案的記錄。 資源 Dockerfile&…

C#/.NET/.NET Core技術前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

粘包問題解決方案

粘包問題詳解&#xff1a;TCP協議中的常見問題及Go語言解決方案 一、什么是粘包問題&#xff1f; 粘包問題是指在TCP通信中&#xff0c;發送方發送的多個獨立消息在接收方被合并成一個消息接收的現象。換句話說&#xff0c;發送方發送的多條消息在接收方被“粘”在一起&#…

vue:突然發現onok無法使用

const that this;this.$confirm({title: "修改商品提示",content: "如果當前商品存在于商品活動庫&#xff0c;則在商品活動庫的狀態會下架",onOk: function () {that.submitForm();}}); 突然發現 this.$confirm無法進入onok 最終發現是主題沖突&#x…

redis hashtable 的sizemask理解

在 Redis 的哈希表實現中&#xff0c;index hash & dict->ht[0].sizemask 是計算鍵值對應存儲位置的核心操作。這個操作看起來簡單&#xff0c;但背后涉及哈希表的內存布局和性能優化策略。我們通過以下步驟逐步解析其原理&#xff1a; 一、哈希表的設計目標 快速定位…

Ruby 命令行選項

Ruby 命令行選項 概述 Ruby 是一種廣泛使用的編程語言,它擁有強大的命令行工具,可以幫助開發者進行各種任務。了解 Ruby 的命令行選項對于提高開發效率至關重要。本文將詳細介紹 Ruby 的常用命令行選項,幫助開發者更好地利用 Ruby 的命令行功能。 Ruby 命令行選項概述 R…

【STM32】WDG看門狗(學習筆記)

學習來源----->江協科技STM32 WDG簡介 WDG&#xff08;Watchdog&#xff09;看門狗看門狗可以監控程序的運行狀態&#xff0c;當程序因為設計漏洞、硬件故障、電磁干擾等原因&#xff0c;出現卡死或跑飛現象時&#xff0c;看門狗能及時復位程序&#xff0c;避免程序陷入長…

Java 數據庫連接池

HikariCP 老外開源的。 Spring Boot 2 之后默認選擇的連接池。 號稱性能最快的數據庫連接池。 為什么性能好呢&#xff1f; ● 字節碼級別的優化-盡量的利用 JIT 的內聯手段 ● 字節碼級別的優化-利用更容易被 JVM 優化的指令 ● 代碼級別的優化-利用改造后的 FastList 代替…

Spring Boot中@Valid 與 @Validated 注解的詳解

Spring Boot中Valid 與 Validated 注解的詳解 引言Valid注解功能介紹使用場景代碼樣例 Validated注解功能介紹使用場景代碼樣例 Valid與Validated的區別結論 引言 在Spring Boot應用中&#xff0c;參數校驗是確保數據完整性和一致性的重要手段。Valid和Validated注解是Spring …