網格圖--Day03--網格圖DFS--2658. 網格圖中魚的最大數目,1034. 邊界著色,1020. 飛地的數量

網格圖–Day03–網格圖DFS–2658. 網格圖中魚的最大數目,1034. 邊界著色,1020. 飛地的數量

今天要訓練的題目類型是:【網格圖DFS】,題單來自@靈艾山茶府。

適用于需要計算連通塊個數、大小的題目。

部分題目做法不止一種,也可以用 BFS 或并查集解決。

DFS函數中的三步曲:判斷,處理,繼續DFS

  • 判斷:是否越界,是否是需要DFS的格子
  • 處理:根據題意處理格子
  • 繼續DFS:DFS四個方向,有時候可能需要收集返回值。

2658. 網格圖中魚的最大數目

思路:

題意轉換:0是水,val是陸地寶藏的數值,找到有最大數值寶藏的陸地。

是不是理解起來就簡單多了?

遍歷每一塊陸地,對比它的價值。找到最大價值。

class Solution {// 題意轉換:0是水,val是陸地寶藏的數值,找到有最大數值寶藏的陸地。private final int[][] DIRS = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };private int dfs(int[][] grid, int i, int j) {if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0) {return 0;}int val = grid[i][j];// 標記為已訪問grid[i][j] = 0;// 用foreach寫,看起來更簡潔了for (int[] d : DIRS) {val += dfs(grid, i + d[0], j + d[1]);}return val;}public int findMaxFish(int[][] grid) {int n = grid.length;int m = grid[0].length;int res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] != 0) {int val = dfs(grid, i, j);res = Math.max(res, val);}}}return res;}
}

1034. 邊界著色

思路:

題目非常啰嗦且復雜,感覺在做閱讀題…………

題意:給指定陸地描邊

  • DFS染色的時候,先染在temp矩陣上,dfs完之后再轉移回去到grid,不然會影響遍歷。復雜很多。
  • 題目說的邊界要求:
    • 情況一:上下左右,只要有跟自己的color不同的,就算邊界。染色!
    • 情況二:當前格子在邊界上,就算邊界。染色!
  • DFS下一個節點:要和本節點顏色相同,且沒訪問過的節點,才能進去。
  • 最后DFS完了,將temp上染色的格子,染回去grid
class Solution {// 題意:給指定陸地描邊private final int[][] DIRS = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };// 染色,先染在temp上,dfs完之后再轉移回去到grid,不然會影響遍歷。復雜很多。private void dfs(int[][] grid, int i, int j, int color, boolean[][] visited, int[][] temp) {// 標記已訪問visited[i][j] = true;// 情況一:上下左右,只要有跟自己的color不同的,就算邊界。染色!int cur = grid[i][j];if (i - 1 >= 0 && grid[i - 1][j] != cur|| i + 1 < grid.length && grid[i + 1][j] != cur|| j - 1 >= 0 && grid[i][j - 1] != cur|| j + 1 < grid[0].length && grid[i][j + 1] != cur) {temp[i][j] = color;}// 情況二:格子在邊界上,就算邊界。染色!if (i == 0 || j == 0 || i == grid.length - 1 || j == grid[0].length - 1) {temp[i][j] = color;}for (int k = 0; k < DIRS.length; k++) {int x = i + DIRS[k][0];int y = j + DIRS[k][1];// xy越界if (x < 0 || y < 0 || x >= grid.length || y >= grid[0].length) {continue;}// 下一個沒訪問過的節點,且這個節點要和當前節點是同色的if (!visited[x][y] && grid[x][y] == cur) {dfs(grid, x, y, color, visited, temp);}}}public int[][] colorBorder(int[][] grid, int row, int col, int color) {int n = grid.length;int m = grid[0].length;boolean[][] visited = new boolean[n][m];int[][] temp = new int[n][m];dfs(grid, row, col, color, visited, temp);// dfs完了之后,將temp上染色的格子,染回去gridfor (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (temp[i][j] != 0) {grid[i][j] = temp[i][j];}}}return grid;}
}

思路:

不用temp數組的版本。

關鍵在于:要先判斷節點是否被visited過,再判斷上下左右是否不同顏色。

這個順序不能換。因為如果visited過了,顏色可能已經被改了,判斷就會有誤。

這個順序是可以不用temp的原因。

public class Solution {// 題意:給指定陸地描邊private final int[][] DIRS = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };public int[][] colorBorder(int[][] grid, int row, int col, int color) {int m = grid.length;int n = grid[0].length;boolean[][] visited = new boolean[m][n];dfs(grid, row, col, grid[row][col], color, visited);return grid;}private int dfs(int[][] grid, int i, int j, int curColor, int paintColor,boolean[][] visited) {// 情況一:越界,說明上一個格子是邊界if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) {return 1;}// 已訪問過的單元格if (visited[i][j]) {return 0;}// 這個順序不能換,要先判斷visited,再判斷顏色相同。因為如果visited過了,顏色可能已經被改了,判斷就會有誤。// 情況二:遇到不同顏色的單元格,說明當前單元格是邊界if (grid[i][j] != curColor) {return 1;}// 標記為已訪問visited[i][j] = true;// 檢查四個方向int isBorder = 0;for (int[] d : DIRS) {isBorder += dfs(grid, i + d[0], j + d[1], curColor, paintColor, visited);}// 如果任何一個方向返回1,說明當前單元格是邊界,需要著色// 最后才著色if (isBorder > 0) {grid[i][j] = paintColor;}return 0;}
}

1020. 飛地的數量

思路:

題意:求內陸。

陸地中,必須至少有一個格子要碰到邊界,否則這個陸地就是所求陸地(內陸)。

  • DFS搜索圖中的每一個島嶼,累加返回每個島嶼的面積。
  • 判斷島嶼是否接觸邊界,如果沒有接觸邊界(內陸),就是所求陸地,累加它的面積到res中。
class Solution {// 題意:陸地中,必須至少有一個格子要碰到邊界,否則這個陸地就是所求陸地(內陸)。private final int[][] DIRS = { { 0, 1 }, { 1, 0 }, { -1, 0 }, { 0, -1 } };private boolean connect = false;private int dfs(int[][] grid, int i, int j) {// 越界了,證明遞歸進來之前,是在邊界上的。trueif (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) {connect = true;return 0;}// 0不一定是邊界,這倆條件不能合在一起if (grid[i][j] == 0) {return 0;}// 標記已訪問grid[i][j] = 0;// DFS累加,求這個島的面積int area = 1;for (int k = 0; k < DIRS.length; k++) {int x = i + DIRS[k][0];int y = j + DIRS[k][1];area += dfs(grid, x, y);}return area;}public int numEnclaves(int[][] grid) {int n = grid.length;int m = grid[0].length;int res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {// 在這里進去每次都是一個獨立的島嶼,要把connect重置if (grid[i][j] == 1) {connect = false;int area = dfs(grid, i, j);// 如果還是沒碰到邊界,是所求的島嶼,累加到resif (!connect) {res += area;}}}}return res;}
}

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

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

相關文章

新能源車焊接中發那科機器人保護氣省氣方法

在新能源汽車制造領域&#xff0c;焊接工藝是保障車身結構強度與安全性的關鍵環節&#xff0c;發那科焊接機器人憑借高精度與穩定性成為產線主力設備。保護氣體消耗在焊接成本中占比顯著&#xff0c;尋找高效省氣方法成為行業降本增效的核心需求。WGFACS節氣裝置以智能化控制技…

CornerNet2025再研究---將目標檢測問題視作關鍵點檢測與配對

CornerNet于2019年3月份提出&#xff0c;CW近期回顧了下這個在當時引起不少關注的目標檢測模型&#xff0c;它的亮點在于提出了一套新的方法論——將目標檢測轉化為對物體成對關鍵點(角點)的檢測。通過將目標物體視作成對的關鍵點&#xff0c;其不需要在圖像上鋪設先驗錨框(anc…

【C++】vector(2)

目錄 1. insert的實現 2. 迭代器失效 2.1 迭代器失效的兩種情況 指向已釋放的內存&#xff08;物理失效&#xff09; 元素移動導致迭代器指向錯誤&#xff08;邏輯失效&#xff09; 2.2 修改代碼 3. erase的實現 ?編輯修改代碼 4. resize的實現 5. 構造函數 5.1 默認…

機器翻譯:python庫translatepy的詳細使用(集成了多種翻譯服務)

更多內容請見: 機器翻譯修煉-專欄介紹和目錄 文章目錄 一、translatepy概述 1.1 translatepy介紹 1.1 安裝 二、基本使用 2.1 初始化 `Translator` 2.2 文本翻譯 2.3 語言檢測 2.4 獲取翻譯備選方案 2.5 單詞音標獲取 2.6 語音合成 2.7 例句查詢 2.8 拼寫檢查 三、高級功能 3.…

Spring Bean生命周期的完全指南

簡介&#xff1a;超越Bean——揭開Spring Bean的隱秘生活 想象一場復雜宏大的舞臺劇。作為觀眾&#xff0c;我們看到的是最終的演出——一個流暢運行的應用程序。但在這光鮮的幕后&#xff0c;隱藏著一套嚴謹細致的流程&#xff1a;選角&#xff08;實例化Bean&#xff09;、試…

網絡安全A模塊專項練習任務九解析

任務九&#xff1a;Linux操作系統安全配置-2任務環境說明&#xff1a; (Linux)系統&#xff1a;用戶名root&#xff0c;密碼1234561. 設置禁止使用最近用過的6個舊密碼&#xff0c;將配置文件中對應的部分截圖&#xff1b;編輯/etc/pam.d/system-auth文件&#xff0c;找到passw…

Linex進程管理

一、進程查看命令1.pstree用于查看進程樹之間的關系&#xff0c;誰是父進程&#xff0c;誰是子進程&#xff0c;可以清楚的看出來是誰創建了誰語法&#xff1a;pstree [選項] -A各進程樹之間的連接以ASCII碼字符來連接-U各進程樹之間的連接以utf8字符來連接&#xff0c;某些終…

手寫MyBatis第47彈:Interceptor接口設計與Invocation上下文傳遞機制--MyBatis動態代理生成與方法攔截的精妙實現

&#x1f942;(???)您的點贊&#x1f44d;?評論&#x1f4dd;?收藏?是作者創作的最大動力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;點贊&#x1f44d;收藏??留言&#x1f4dd;歡迎留言討論 &#x1f525;&#x1f525;&…

自動駕駛中的傳感器技術37——Lidar(12)

這里對當前Lidar中的一些常見問題進行專項論述。首先以禾賽Lidar為例&#xff0c;列出相關參數&#xff0c;以備論述。 圖1 禾賽AT128參數圖2 禾賽AT360參數圖3 禾賽AT1440參數圖4 禾賽AT128可靠性驗證項圖5 禾賽AT128產品證書1、Lidar的線束是什么&#xff0c;由什么決定&…

Meteor主題友鏈頁面自研

發布于&#xff1a;Eucalyptus-Blog Meteor主題雖然設計簡約現代&#xff0c;但由于缺乏原生的友情鏈接管理功能&#xff0c;許多博主只能將友情鏈接勉強添加在網站底部&#xff0c;這不僅影響頁面美觀&#xff0c;也不便于訪客查找和互動&#xff1b;為了解決這一痛點&#xf…

QT控件QPlainTextEdit、QTextEdit與QTextBrowser的區別

一.主要功能對比二.關鍵功能差異1.文本類型支持QPlainTextEdit&#xff1a;僅支持純文本&#xff08;Plain Text&#xff09;&#xff0c;不處理任何格式&#xff08;如字體、顏色、鏈接、圖片等&#xff09;。文本以原始字符形式存儲&#xff0c;適合處理日志、代碼、配置文件…

【思考】WSL是什么

WSL WSL是什么呢&#xff1f; WSL 是 windows subsystem for linux 的簡寫&#xff0c;指的是 windows10 的一個子系統&#xff0c;這個子系統的作用是在 windows 下運行 linux 操作系統。 有了WSL&#xff0c;就可以在 windows10 中運行linux操作系統了。許多在 linux 種運行的…

基于單片機智能飲水機/智能熱水壺

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 基于單片機的智能飲水機系統通過嵌入式技術實現水溫控制、水量監測及用戶交互功能。系統采用STM3…

Unity游戲打包——iOS打包基礎、傳包

本文由 NRatel 歷史筆記整理而來&#xff0c;如有錯誤歡迎指正。 相關參考文檔 Unity文檔 -> 平臺開發 -> IOS https://docs.unity3d.com/cn/2021.3/Manual/iphone.html Unity導出的Xcode 項目的結構 Modifying an Xcode project use Xcode.PBXProject. https://doc…

pyside6小項目:進制轉換器

from PySide6.QtUiTools import QUiLoader from PySide6.QtWidgets import QApplication,QWidgetclass MyWindow(QWidget):def __init__(self):super().__init__()self.ui QUiLoader().load(trans.ui)self.ui.show()#stor data type dictionaryself.lengthVar {米:100, 千米:…

再見 K8s!3款開源的云原生部署工具

前文&#xff0c;和大家分享了云原生中的核心工具 K8s&#xff1a; 關于 K8s&#xff1a;入門&#xff0c;這篇就夠了 K8s是個好東西&#xff0c;就是上手門檻有點高。這不&#xff0c;需求就來了&#xff1f; 有需求&#xff0c;就有工具。 為了解決K8s的配置難題&#xf…

C++ 快速復習指南(上半部分)

1.基礎語法基本結構#include <iostream> 頭名 using namesapce std ; 統一使用命名空間 int main () { 程序執行門戶 主題內容}基本輸出 cout << "string " << endl; // 輸出 string 變量和數據類型 格式int intger 10 ;常量的引入 需要在變量…

ArcGIS Pro 地圖打包與解包

如果需要在ArcGIS Pro 打包某一個地圖文檔&#xff0c;在 菜單欄中 點擊 共享&#xff0c;點擊地圖。彈出 打包地圖 面板&#xff0c;可以打包到Online、打包到地圖包&#xff0c;選擇將包保存到文件&#xff0c;修改項目詳細信息&#xff0c;點擊 包&#xff0c;即可實現打包。…

sunset: twilight靶場

sunset: twilight 來自 <sunset: twilight ~ VulnHub> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.128&#xff0c;靶場IP192.168.23.145 3&#xff0c;對靶機…

【機器學習基礎】無監督學習算法的現代演進:從數據探索到智能系統的自主發現能力

1. 引言:無監督學習在人工智能革命中的核心價值 在人工智能技術飛速發展的今天,無監督學習正在成為推動AI系統實現真正智能的關鍵技術。與需要大量標注數據的監督學習不同,無監督學習能夠從原始數據中自主發現隱藏的模式和結構,這種能力使其在現代AI應用中具有不可替代的價…