算法第五十一天:圖論part02(第十一章)

1.島嶼數量

99. 島嶼數量

🌟 思路總結 — DFS 版

1?? 問題本質

  • 給定一個二維矩陣 grid,1 表示陸地,0 表示水

  • 統計島嶼數量,每個島嶼由上下左右相鄰的陸地組成

本質是 在二維網格中找連通塊 的問題。


2?? 核心思路

  1. 遍歷矩陣

    • 對每個格子 (i,j)

      • 如果是陸地 (grid[i][j] == 1) 且未訪問過
        → 說明發現一個新島嶼,島嶼計數 +1

  2. DFS 擴展島嶼

    • 從新發現的陸地出發,深度優先遞歸訪問上下左右相鄰的陸地

    • 每訪問一個陸地就標記為已訪問 visited[i][j] = True

    • 遞歸結束后,這塊島嶼的所有陸地都被標記,避免重復計數

  3. 返回島嶼數量

    • 遍歷完矩陣后,島嶼計數就是答案


3?? 核心技巧

  1. 方向數組

 

direction = [[0,1],[1,0],[0,-1],[-1,0]] # 右、下、左、上

  • 遍歷鄰居時統一處理

  • next_x = x + dx, next_y = y + dy

  1. 訪問標記

  • visited 二維布爾數組標記已訪問的陸地

  • DFS 或 BFS 入隊/遞歸時立即標記,防止重復訪問

  1. 越界判斷

 

if nextx < 0 or nextx >= n or nexty < 0 or nexty >= m: continue

  • 避免訪問矩陣外的元素

#深度優先
direction = [[0, 1], [1, 0], [-1, 0], [0, -1]]  #依次是右,下, 上, 左
def dfs(grid, visited, x, y):for i, j in direction:nextx = x + inexty = y + j#判斷是否越界if nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continue# 如果是陸地且未訪問if grid[nextx][nexty] == 1 and visited[nextx][nexty] == False:visited[nextx][nexty] = Truedfs(grid, visited, nextx, nexty)def main():#輸入,存圖n, m = map(int, input().split())grid = []for i in range(n):grid.append(list(map(int, input().split())))visited = [[False] * m for _ in range(n)]result = 0for i in range(n):for j in range(m):if grid[i][j] == 1 and visited[i][j] == False:result += 1visited[i][j] = True#dfsdfs(grid, visited, i, j)return resultif __name__ == "__main__":print(main())

2.廣度優先搜索的理論基礎

步驟:先將起點加入隊列, 標記為true, 取出當前節點,沿四個方向遍歷判斷是否訪問過,未訪問則加入隊列,標記為true。直至隊列為空則廣搜結束

direction = [[0,1], [1, 0], [-1, 0], [0, -1]]def bfs(grid, visited, x, y):que = deque()que.apppend(x, y)visited[x][y] == Truewhile que:curx, cury = que.popleft()for i, j in direction:nextx = curx + inexty = cury + jif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif not visited[nextx][nexty]:que.append([nextx, nexty])visited[nextx][nexty] == 1

島嶼數量用廣度搜索重做一遍:


from collections import dequedirection = [[0, 1], [1, 0], [-1, 0], [0, -1]]
def bfs(grid, visited, x, y):queue = deque()queue.append([x, y])visited[x][y] = Truewhile queue:cur_x, cur_y = queue.popleft()  #取出隊首元素for i, j in direction:nextx = cur_x + inexty = cur_y + jif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif not visited[nextx][nexty] and grid[nextx][nexty] == 1:visited[nextx][nexty] = Truequeue.append([nextx, nexty])def main():n, m = map(int, input().split())grid = []for i in range(n):grid.append(list(map(int, input().split())))visited = [[False] * m for _ in range(n)]result = 0for i in range(n):for j in range(m):if grid[i][j] == 1 and not visited[i][j]:result += 1bfs(grid, visited, i, j)print(result)if __name__ == "__main__":main()

3.島嶼的最大面積

📝 代碼功能

  • 這是一個求最大島嶼面積的程序(不是島嶼數量)。

  • 輸入一個 n×m 的矩陣 grid1 表示陸地,0 表示水。

  • 使用 DFS(深度優先搜索)遍歷每一塊島嶼,同時統計它的面積。

  • 最終輸出所有島嶼中的最大面積


🔑 核心思路

  1. 方向數組

     

    direction = [[0, 1], [1, 0], [-1, 0], [0, -1]]

    用來表示四個相鄰方向:右、下、上、左。

  2. DFS 深度優先搜索

     

    def dfs(grid, visited, x, y): global area for i, j in direction: nextx = x + i nexty = y + j ...

    • 從一個陸地 (x, y) 出發,遞歸探索它相鄰的陸地;

    • 每發現一個新的陸地,就 area += 1

    • 并且標記 visited[nextx][nexty] = True,避免重復訪問。

  3. 遍歷矩陣

     

    for i in range(n): for j in range(m): if grid[i][j] == 1 and not visited[i][j]: area = 1 visited[i][j] = True dfs(grid, visited, i, j) res = max(res, area)

    • 遍歷整個矩陣;

    • 每遇到一個未訪問的陸地 (i, j),說明發現一塊新島嶼;

    • 從這里開始 DFS,計算該島嶼面積;

    • 更新最大面積 res

direction = [[0, 1], [1, 0], [-1, 0], [0, -1]]
area = 0
def dfs(grid, visited, x, y):global areafor i, j in direction:nextx = x + inexty = y + jif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif not visited[nextx][nexty] and grid[nextx][nexty] == 1:area += 1visited[nextx][nexty] = Truedfs(grid, visited, nextx, nexty)n, m = map(int, input().split())
grid = []
for i in range(n):grid.append(list(map(int, input().split())))
visited = [[False] * m for _ in range(n)]
res = 0for i in range(n):for j in range(m):if grid[i][j] == 1 and not visited[i][j]:area = 1visited[i][j] = Truedfs(grid, visited, i, j)res = max(res, area)
print(res)

今日結束啦!!!

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

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

相關文章

杰里708n tws api 簡介

/** 通過搜索碼搜索tws設備*/int tws_api_search_sibling_by_code();/**打開可發現, 可連接&#xff0c;可被手機和tws搜索到*/int tws_api_wait_pair_by_code(u16 code, const char *name, int timeout_ms);int tws_api_wait_pair_by_ble(u16 code, const char *name, int tim…

高調光比 LED 恒流驅動芯片方案詳解AP5165B:36V/1A

AP5165B 是深圳市世微半導體有限公司推出的一款高性能、連續電流模式的降壓型&#xff08;Buck&#xff09;LED 恒流驅動芯片。該芯片適用于輸入電壓高于 LED 電壓的應用場景&#xff0c;可驅動單顆或多顆串聯的 LED&#xff0c;輸出電流最高可達 1A&#xff0c;廣泛用于非隔離…

【從零構建企業級線程池管理系統:Python并發編程實戰指南】

從零構建企業級線程池管理系統&#xff1a;Python并發編程實戰指南 技術博客 | 深入探索Python并發編程、Web開發與現代軟件架構設計的完整實踐 &#x1f680; 項目背景 在當今高并發的互聯網時代&#xff0c;線程池作為并發編程的核心組件&#xff0c;其管理和監控能力直接影…

飛牛系統總是死機,安裝個工具查看一下日志

崩潰轉儲 (kernel crash dump)如果你懷疑是內核 panic&#xff0c;可以開啟 kdump 或 kernel crash dump。 安裝&#xff1a;sudo apt install kdump-tools # Debian/Ubuntu sudo systemctl enable kdump 下次死機時&#xff0c;系統會把內存 dump 到 /var/crash 里。sudo syst…

2025年AI Agent技術深度解析:原理、應用與未來趨勢

一、引言隨著人工智能技術的飛速發展&#xff0c;AI Agent&#xff08;智能體&#xff09;作為人工智能領域的重要分支&#xff0c;正逐漸成為推動各行業智能化轉型的關鍵力量。AI Agent具備自主感知、決策和執行能力&#xff0c;能夠在復雜環境中完成特定任務&#xff0c;為人…

linux內核 - 內存分配機制介紹

在linux內核中&#xff0c;下面這張圖說明了系統中存在一個可以滿足各種內存請求的分配機制。根據你需要內存的用途&#xff0c;你可以選擇最接近你目標的分配方式。最底層、最基礎的分配器是 頁分配器&#xff08;page allocator&#xff09;&#xff0c;它以頁為單位分配內存…

PyTorch生成式人工智能——ACGAN詳解與實現

PyTorch生成式人工智能——ACGAN詳解與實現0. 前言1. ACGAN 簡介1.1 ACGAN 技術原理1.2 ACGAN 核心思想1.3 損失函數2. 模型訓練流程3. 使用 PyTorch 構建 ACGAN3.1 數據處理3.2 模型構建3.3 模型訓練3.4 模型測試相關鏈接0. 前言 在生成對抗網絡 (Generative Adversarial Net…

Python + 淘寶 API 開發:自動化采集商品數據的完整流程?

在電商數據分析、競品監控和市場調研等場景中&#xff0c;高效采集淘寶商品數據是關鍵環節。本文將詳細介紹如何利用 Python 結合 API&#xff0c;構建一套自動化的商品數據采集系統&#xff0c;涵蓋從 API 申請到數據存儲的完整流程&#xff0c;并提供可直接運行的代碼實現。?…

2025.8.21總結

工作一年多了&#xff0c;在這期間&#xff0c;確實也有不少壓力&#xff0c;但每當工作有壓力的時候&#xff0c;最后面都會解決。好像每次遇到解決不了的事情&#xff0c;都有同事給我兜底。這種壓力&#xff0c;確實會加速一個人的成長。這種狼性文化&#xff0c;這種環境&a…

VS2022 - C#程序簡單打包操作

文章目錄VS2022 - C#程序簡單打包操作概述筆記實驗過程新建工程讓依賴的運行時程序安裝包在安裝時運行(如果發現運行時不能每次都安裝程序&#xff0c;就不要做這步)關于”運行時安裝程序無法每次都安裝成功“的應對知識點嘗試打包舊工程bug修復從需求屬性中&#xff0c;可以原…

在JAVA中如何給Main方法傳參?

一、在IDEA中進行傳參&#xff1a;先創建一個類&#xff1a;MainTestimport java.util.Arrays;public class MainTest {public static void main(String[] args) {System.out.println(args.length);System.out.println(Arrays.toString(args));} }1.IDEA ---> 在運行的按鈕上…

ORACLE中如何批量重置序列

背景&#xff1a;數據庫所有序列都重置為1了&#xff0c;所以要將所有的序列都更新為對應的表主鍵&#xff08;這里是id&#xff09;的最大值1。我這里序列的規則是SEQ_表名。BEGINENHANCED_SYNC_SEQUENCES(WJ_CPP); -- 替換為你的模式名 END; / CREATE OR REPLACE PROCEDURE E…

公號文章排版教程:圖文雙排、添加圖片超鏈接、往期推薦、推文采集(2025-08-21)

文章目錄 排版的基本原則 I 圖片超鏈接 方式1: 利用公號原生編輯器 方式2:在CSDN平臺使用markdown編輯器, 利用標簽實現圖片鏈接。 II 排版小技巧 自定義頁面模版教程 使用壹伴進行文章素材的采集 美編助手的往期推薦還不錯 利用365編輯器創建圖文雙排效果 排版的基本原則 親…

計算兩幅圖像在特定交點位置的置信度評分。置信度評分反映了該位置特征匹配的可靠性,通常用于圖像處理任務(如特征匹配、立體視覺等)

這段代碼定義了一個名為compute_confidence的函數&#xff0c;用于計算兩幅圖像在特定交點位置的置信度評分。置信度評分反映了該位置特征匹配的可靠性&#xff0c;通常用于圖像處理任務&#xff08;如特征匹配、立體視覺等&#xff09;。以下是逐部分解析&#xff1a; 3. 結果…

計算機視覺第一課opencv(三)保姆級教學

簡介 計算機視覺第一課opencv&#xff08;一&#xff09;保姆級教學 計算機視覺第一課opencv&#xff08;二&#xff09;保姆級教學 今天繼續學習opencv。 一、 圖像形態學 什么是形態學&#xff1a;圖像形態學是一種處理圖像形狀特征的圖像處理技術&#xff0c;主要用于描…

24.早期目標檢測

早期目標檢測 第一步&#xff0c;計算機圖形學做初步大量候選框&#xff0c;把物體圈出來 第二步&#xff0c;依次將所有的候選框圖片&#xff0c;輸入到分類模型進行判斷 選擇性搜索 選擇搜索算法&#xff08;Selective Search&#xff09;&#xff0c;是一種熟知的計算機圖像…

Java基礎知識點匯總(三)

一、面向對象的特征有哪些方面 Java中面向對象的特征主要包括以下四個核心方面&#xff1a;封裝&#xff08;Encapsulation&#xff09; 封裝是指將對象的屬性&#xff08;數據&#xff09;和方法&#xff08;操作&#xff09;捆綁在一起&#xff0c;隱藏對象的內部實現細節&am…

GEO優化專家孟慶濤:讓AI“聰明”選擇,為企業“精準”生長

在生成式AI席卷全球的今天&#xff0c;企業最常遇到的困惑或許是&#xff1a;“為什么我的AI生成內容總像‘模板套娃’&#xff1f;”“用戶明明想要A&#xff0c;AI卻拼命輸出B&#xff1f;”當生成式AI從“能用”邁向“好用”的關鍵階段&#xff0c;如何讓AI真正理解用戶需求…

【交易系統系列04】交易所版《速度與激情》:如何為狂飆的BTC交易引擎上演“空中加油”?

交易所版《速度與激情》&#xff1a;如何為狂飆的BTC交易引擎上演“空中加油”&#xff1f; 想象一下這個場景&#xff1a;你正端著一杯熱氣騰騰的咖啡&#xff0c;看著窗外我家那只貪睡的橘貓趴在陽光下打著呼嚕。突然&#xff0c;手機上的警報開始尖叫&#xff0c;交易系統監…

windows下jdk環境切換為jdk17后,臨時需要jdk1.8的處理

近段時間&#xff0c;終于決定把開發環境全面轉向jdk17&#xff0c;這不就遇到了問題。 windows主環境已經設置為jdk17了。 修改的JAVA_HOME D:\java\jdk-17CLASSPATH設置 .;D:\java\jdk-17\lib\dt.jar;D:\java\jdk-17\lib\tools.jar;PATH中增加 D:\java\jdk-17\bin但是有些程序…