FloodFill算法——DFS

FloodFill算法就是用來尋找性質相同的連通快的算法,這篇博客都是用dfs來實現FloodFill算法

1.圖像渲染

題目鏈接:733. 圖像渲染 - 力扣(LeetCode)?

?題目解析:將和(sr,sc)相連的所有像素相同的點,將這些點的值都修改為目標值

算法講解:

利用深搜,遍歷所有與初始點相連的所有像素相同的點,然后將其修改成指定的像素值即可

代碼實現:

一個小細節:如果color==image[sr][sc],此時就不用去遍歷image了,此時直接返回image即可,或者也可以創建一個check的boolean類型的數組,去標記已經訪問的位置

//第一種寫法
class Solution {int h,l,prev;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public int[][] floodFill(int[][] image, int sr, int sc, int color) {h=image.length;l=image[0].length;prev=image[sr][sc];if(prev==color) return image;dfs(image,sr,sc,color);return image;}public void dfs(int[][] image,int i,int j,int color){image[i][j]=color;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && image[x][y]==prev){dfs(image,x,y,color);}}}
}//第二種寫法
class Solution {int h,l,prev;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};boolean[][] check;public int[][] floodFill(int[][] image, int sr, int sc, int color) {h=image.length;l=image[0].length;check=new boolean[h][l];prev=image[sr][sc];dfs(image,sr,sc,color);return image;}public void dfs(int[][] image,int i,int j,int color){image[i][j]=color;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && image[x][y]==prev && check[x][y]==false){check[x][y]=true;dfs(image,x,y,color);check[x][y]=false;}}}
}

2.島嶼數量?

題目鏈接:200. 島嶼數量 - 力扣(LeetCode)

?題目解析:計算島嶼的數量,也就是計算grid數組中數字為1的連通快的個數?

算法講解: FloodFill

首先要創建一個同等規模的check的boolean數組,先遍歷一遍grid數組,當遇到1時且該對應的check[i][j]==false,就通過dfs遞歸函數將這個位置的上下左右中為1的位置的對應到check數組中的值改為true即可

代碼實現:

class Solution {boolean[][] check;int h,l;int[] dx={0,0,-1,1};int[] dy={-1,1,0,0};public int numIslands(char[][] grid) {h=grid.length;l=grid[0].length;int ret=0;check=new boolean[h][l];for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(grid[i][j]=='1'&&check[i][j]==false){ret++;dfs(grid,i,j);}}}return ret;}public void dfs(char[][] grid,int i,int j){check[i][j]=true;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && check[x][y]==false && grid[x][y]=='1'){dfs(grid,x,y);}}}
}

?3.島嶼的最大面積

題目解析:返回最大島嶼的面積

算法講解:FloodFill

依舊是對grid數組做一遍深度優先遍歷,當遇到1時,就上下左右去尋找連通的1,且創建一個全局變量area去記錄每一次遞歸時找到的島嶼的面積

代碼實現:

代碼細節:每次遞歸之前要將area置為0,因為每一次遞歸都是去找新的島嶼,計算新的島嶼的面積之前,要將之前計算的島嶼的面積去掉,也就是將area置為0?

class Solution {boolean[][] vis;int h,l,area,ret;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public int maxAreaOfIsland(int[][] grid) {h=grid.length;l=grid[0].length;vis=new boolean[h][l];for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(grid[i][j]==1&&vis[i][j]==false){area=0;//小細節dfs(grid,i,j);ret=Math.max(ret,area);}}}return ret;}public void dfs(int[][] grid,int i,int j){area++;vis[i][j]=true;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && grid[x][y]==1 && vis[x][y]==false){dfs(grid,x,y);}}}
}

4.被圍繞的區域

題目鏈接:130. 被圍繞的區域 - 力扣(LeetCode)?

?題目解析:將矩陣中的被X圍繞的連通O區域中的字母全部改為字母X

算法講解:FloodFill

這道題的難點就是在于處理位于邊界的連通O區域,如果我們直接對矩陣進行一遍深度遍歷,那馬就要寫兩個dfs函數,一個用來處理內部的O區域,另一個用來處理處于邊界的O區域,但是這樣寫是在是太復雜了

正難則反,,我們可以先去處理邊界的情況,先將位于邊界的連通O區域全部改為字符點,處理完邊界情況之后,在去遍歷矩陣,遇到字符點,則就將其還原成O,此時如果遇到O,那么此時的O區域肯定是合法的,此時直接將O改為X即可

代碼實現:

class Solution {int h,l;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public void solve(char[][] board) {h=board.length;l=board[0].length;for(int j=0;j<l;j++){if(board[0][j]=='O') dfs(board,0,j);if(board[h-1][j]=='O') dfs(board,h-1,j);}for(int i=0;i<h;i++){if(board[i][0]=='O') dfs(board,i,0);if(board[i][l-1]=='O') dfs(board,i,l-1);}for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(board[i][j]=='.') board[i][j]='O';else if(board[i][j]=='O') board[i][j]='X';}}}public void dfs(char[][] board,int i,int j){board[i][j]='.';for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && board[x][y]=='O'){dfs(board,x,y);}}}
}

5.太平洋大西洋流水問題?

題目鏈接:417. 太平洋大西洋水流問題 - 力扣(LeetCode)?

題目解析:找出矩陣中既能流入太平洋和大西洋的位置

解法一:直接暴搜

直接遍歷矩陣,直接對每一個位置進行一遍FloodFill,但是這樣會出現重復走大量的重復路徑,代碼可能會超時?

解法二:正難則反?

我們可以轉換一下思路,題目要求我們找出既能流入太平洋又能流入大西洋的位置,可以反過來思考,從太平洋或者大西洋能流入矩陣的哪一些位置,此時創建兩個同等規模的boolean類型的數組paci和atla,如果paci[i][j]或者atla[i][j]的值為true,那么就代表從太平洋或者大西洋的水能流入(i,j)位置,當paci[i][j]和atla[i][j]的值同時為true時,就代表太平洋和大西洋的水都能能流入(i,j)位置?

此時對分別對第一行和第一列,最后一行和最后一列,分別進行一遍FloodFill即可?

代碼實現:

class Solution { List<List<Integer>> ret;int h,l;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public List<List<Integer>> pacificAtlantic(int[][] heights) {h=heights.length;l=heights[0].length;boolean[][] paci=new boolean[h][l];boolean[][] atla=new boolean[h][l];ret=new ArrayList<>();//處理太平洋//第一行for(int j=0;j<l;j++) dfs(heights,0,j,paci);//第一列for(int i=0;i<h;i++) dfs(heights,i,0,paci);//處理大西洋//最后一行for(int j=0;j<l;j++) dfs(heights,h-1,j,atla);//最后一列for(int i=0;i<h;i++) dfs(heights,i,l-1,atla);for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(paci[i][j]==true&&atla[i][j]==true){List<Integer> tmp=new ArrayList<>();tmp.add(i);tmp.add(j);ret.add(tmp);}}}return ret;}public void dfs(int[][] heights,int i,int j,boolean[][] ocean){ocean[i][j]=true;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && heights[x][y]>=heights[i][j] && ocean[x][y]==false){dfs(heights,x,y,ocean);}}}
}

6.掃雷游戲?

題目鏈接:529. 掃雷游戲 - 力扣(LeetCode)?

題目解析:就是掃雷游戲的規則,點擊一個為挖出的方塊,則與這個空格相連的空格也會被展開,如果某一個空格的相鄰有地雷的花,就不展開與這個空格相鄰的空格,只需要將這個空格的值改為地雷的數量即可

算法講解:FloodFill?

這道題就是對棋盤從點擊的位置進行一遍深度遍歷即可,如果遇到為挖出的空格,則將其翻轉即可,但是如果未挖出的空格相鄰位置有地雷,將這個空格的值改為地雷的數量

則此時dfs函數就是用來翻轉空格的,但是翻轉的情況有兩種,如果空格的相鄰位置沒有地雷,將M改為B即可,如果空格的相鄰位置有地雷,要將M給為地雷的數量,所以此時在遞歸之前,要對地雷的數量進行一個判斷

代碼實現:

class Solution {int h,l;int[] dx={0,0,-1,1,-1,-1,1,1};int[] dy={-1,1,0,0,-1,1,-1,1};public char[][] updateBoard(char[][] board, int[] click) {h=board.length;l=board[0].length;int x=click[0];int y=click[1];if(board[x][y]=='M'){board[x][y]='X';return board;}dfs(board,x,y);return board;}public void dfs(char[][] board,int i,int j){//判斷地雷的數量int count=0;for(int k=0;k<8;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && board[x][y]=='M'){count++;}}if(count==0){board[i][j]='B';for(int k=0;k<8;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && board[x][y]=='E'){dfs(board,x,y);}}}else{board[i][j]=(char)('0'+count);}}
}

7. 衣櫥整理

題目鏈接:LCR 130. 衣櫥整理 - 力扣(LeetCode)?

題目描述:如上圖

算法講解:FloodFill

依舊是對m行n列的放個做一遍深度優先遍歷即可

代碼實現:

class Solution {int ret;int h,l;boolean[][] vis;int[] dx={0,0,-1,1};int[] dy={-1,1,0,0};public int wardrobeFinishing(int m, int n, int t) {h=m;l=n;vis=new boolean[h][l];dfs(0,0,t);return ret;}public void dfs(int i,int j,int t){vis[i][j]=true;ret++;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];int tmp=(x/10)+(x%10)+(y/10)+(y%10);if(x>=0 && x<h && y>=0 && y<l && tmp<=t && vis[x][y]==false){dfs(x,y,t);}}}
}

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

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

相關文章

【BUUCTF系列】[極客大挑戰 2019]LoveSQL 1

本文僅用于技術研究&#xff0c;禁止用于非法用途。 Author:枷鎖 文章目錄一、題目核心漏洞分析二、關鍵解題步驟與技術解析1. 確定列數&#xff08;ORDER BY&#xff09;2. 聯合查詢獲取表名3. 爆破字段名4. 提取Flag三、漏洞根源與防御方案1. 漏洞成因2. 防御措施四、CTF技巧…

AI時代,童裝銷售的“指路明燈”

別看現在AI、大數據這些詞眼花繚亂的&#xff0c;當年我剛入行那會兒&#xff0c;也跟你一樣&#xff0c;對著一堆庫存和銷量數據發愁&#xff0c;不知道勁兒該往哪使。童裝銷售這行&#xff0c;看著簡單&#xff0c;其實水挺深。不過呢&#xff0c;這二十多年摸爬滾打下來&…

Swin-Transformer從淺入深詳解

第一部分&#xff1a;出現背景在 Swin Transformer 出現之前&#xff0c;計算機視覺&#xff08;Computer Vision, CV&#xff09;領域主要由 CNN (卷積神經網絡) 主導。后來&#xff0c;NLP&#xff08;自然語言處理&#xff09;領域的 Transformer 模型被引入 CV&#xff0c;…

如何手動打包 Linux(麒麟系統)的 Qt 程序

gcc版本 gcc版本確保目標系統&#xff08;運行環境&#xff09;的 GCC 版本 高于或等于開發環境的版本&#xff0c;否則程序無法在目標平臺運行。通過 gcc -v 可查看當前版本。cmake生成可執行文件 強烈建議在cmakelists添加設置運行時 rpath 為 $ORIGIN/…/lib&#xff08;相對…

解決 “crypto.hash is not a function”:Vite 從 6.x 升級至 7.x 后 `pnpm run dev` 報錯問題

&#x1f680; 作者主頁&#xff1a; 有來技術 &#x1f525; 開源項目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 倉庫主頁&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 歡迎點贊 &#x1f44d; 收藏 ?評論 …

我的創作紀念日____在 CSDN一年來的成長歷程和收獲

365 天創作札記&#xff1a;在代碼與文字的褶皺里&#xff0c;遇見 1300 束光一年來。點開csdn網站后臺粉絲數的那一刻&#xff0c;1327 這個數字在屏幕上微微發燙。原來那些在深夜敲下的字符、調試到凌晨的代碼示例、反復修改的技術拆解&#xff0c;真的在時光里悄悄織成了一張…

VirtualBox 的 HOST 鍵(主機鍵)是 右Ctrl 鍵(即鍵盤右側的 Ctrl 鍵)筆記250802

VirtualBox 的 HOST 鍵&#xff08;主機鍵&#xff09;是 右Ctrl 鍵&#xff08;即鍵盤右側的 Ctrl 鍵&#xff09;筆記250802 VirtualBox 的 HOST 鍵&#xff08;主機鍵&#xff09;是什么?HOST鍵 是 右Ctrl 鍵VirtualBox 的 主機鍵&#xff08;Host Key&#xff09; 是一個…

Zama的使命

全同態加密&#xff08;Fully Homomorphic Encryption&#xff0c;FHE&#xff09;實現互聯網端到端加密的使命的重要里程碑。(FHE) 是一種無需解密即可處理數據的技術。它可用于在公共、無需許可的區塊鏈上創建私人智能合約&#xff0c;只有特定用戶才能看到交易數據和合約狀態…

Go語言流式輸出技術實現-服務器推送事件(Server-Sent Events, SSE)

目錄引言背景與技術概述實現技術細節1. HTTP 頭部配置2. 事件格式與發送3. 保持連接與刷新4. 處理連接關閉4.1 使用上下文管理連接生命周期4.2 使用通道管理客戶端連接5. 客戶端交互6.demo7.Go轉發大模型流式輸出demo引言 服務器推送事件&#xff08;Server-Sent Events, SSE&…

高端房產管理小程序

系統介紹1、用戶端地圖找房&#xff1a;對接地圖API&#xff0c;地圖形式顯示周邊房源,支持新盤和租房兩種模式查詢房價走勢&#xff1a;城市房價走勢&#xff0c;由后臺每月錄入房源搜索&#xff1a;搜索房源&#xff0c;支持多維度篩選房源類型&#xff1a;新盤銷售、房屋租賃…

文本轉語音(TTS)腳本

文本轉語音(TTS)腳本 概述 generate_voice.py 是一個用于生成語音的Python腳本。該腳本提供了文本轉語音(TTS)功能&#xff0c;可以將文本內容轉換為語音文件。 功能特性 文本轉語音: 將輸入的文本轉換為語音文件多種語音選項: 支持不同的語音類型和參數批量處理: 可以處理多個…

磁盤管理與分區

磁盤管理 一、磁盤類型 SATA,SCSI,SAS類型的磁盤&#xff0c;在Linux中用sd來表示。 其中第一塊硬盤為sda&#xff0c;第二塊二sdb&#xff0c;以此類推。 第一塊硬盤的第一個分區為sda1。 nvme類型的磁盤&#xff0c;在Linux中使用nvmeXnYpZ進行表示。 X&#xff1a;數字&…

Linux 邏輯卷管理

練習創建物理卷(pv->vg->lv)物理卷&#xff08;PV&#xff09;就像把一塊塊獨立的硬盤&#xff0c;標記成 "可用于搭建 LVM 的積木"&#xff0c;讓系統知道這些硬盤可以被 LVM 管理。#把sdb這塊硬盤標記為物理卷&#xff08;相當于給這塊積木蓋章&#xff0c;說…

向日葵參考基因組

向日葵參考基因組升級多個版本 向日葵基因組為油脂代謝、開花調控及菊類植物進化提供新見解-文獻精讀151-CSDN博客 官網 https://www.sunflowergenome.org/annotations-data/

什么是爬蟲協議?

什么是爬蟲協議&#xff1f; 爬蟲協議&#xff08;Crawl Protocol&#xff09;是指為了有效地收集網頁內容而建立的一些規定和標準&#xff0c;用以指導網絡爬蟲如何在互聯網上抓取信息。 爬蟲協議主要指的是Robots協議&#xff08;Robots Exclusion Protocol&#xff09;&am…

空間平面旋轉與xoy平行

空間平面旋轉與xoy平行 法向量 空間平面axbyczd0的其中一個法向量(a,b,c),法向量垂直于空間平面。目標平面平行于xoy的平面為0x0yczd0;其中一個法向量為(0,0,c),c可以為不為0的任意值&#xff0c;取(0,0,1)&#xff0c;目標平面的的法向量垂直于xoy平面 向量叉乘點乘 兩個向量的…

odoo reportbro 拖拽式報表設計

報表設計以及下載 在實際業務中應用非常的廣泛且頻繁。odoo 本身也具有報表設計功能&#xff0c;但都是代碼模式。且需要開發人員定制化開發&#xff0c;耗費成本高 所以引入reportbro報表設計就非常的簡單快捷。低代碼模式 以下以銷售報表為例進行演示 報表字段配置報表界面設…

數字信號處理_編程實例1

stem([1,2,3]) 一、初始設置 %% 初始設置 % 清空工作空間&#xff0c;關閉無關頁面 clc,clear,close all; % 繪圖變量 font_size 12; %全局基礎字體大小 axis_size 10; %坐標軸刻度標簽字體大小 line_width 2; %繪圖線條寬度 legend_size 10.5; %圖例字體大小 marker_siz…

Docker 安裝部署 OceanBase

1.拉取鏡像 docker pull oceanbase/oceanbase-ce:latest2.啟動oceanbase容器 docker run -p 2881:2881 --name oceanbase-ce -e MINI_MODE0 -d quay.io/oceanbase/oceanbase-ce3.查看oceanbase初始化的日志信息 docker logs oceanbase-ce4.進入oceanbase容器 docker exec -it o…

【華為機試】685. 冗余連接 II

文章目錄685. 冗余連接 II題目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解題思路算法分析核心思想算法策略算法對比問題分類流程圖并查集環檢測流程入度統計與候選邊選擇情況分析決策樹完整算法流程復雜度分析時間復雜度空間復雜度關鍵實現技巧1. 并查集優化2…