【代碼隨想錄訓練營】【Day 66】【圖論-3】| 卡碼 101-104

【代碼隨想錄訓練營】【Day 66】【圖論-3】| 卡碼 101-104

需強化知識點

  • 103,104 優化思路

題目

101. 孤島的總面積

  • 此處 area 多余
def dfs(grid, x, y, area):dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n = len(grid), len(grid[0])area[0] += 1grid[x][y] = 0for add_x, add_y in dirs:next_x, next_y = x + add_x, y + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continueif grid[next_x][next_y]:dfs(grid, next_x, next_y, area)tmp = list(map(int, input().split()))
m, n = tmp[0], tmp[1]
grid = [[0] * n for _ in range(m)]for i in range(m):tmp = list(map(int, input().split()))for j in range(n):grid[i][j] = tmp[j]for i in range(m):if grid[i][0]:dfs(grid, i, 0, [0])if grid[i][n-1]:dfs(grid, i, n-1, [0])for j in range(n):if grid[0][j]:dfs(grid, 0, j, [0])if grid[m-1][j]:dfs(grid, m-1, j, [0])cur = 0
for i in range(m):for j in range(n):if grid[i][j]:cur += 1print(cur)          

102. 沉沒孤島

  • 思路:從左右上下邊界出發遍歷,然后visited數組標記,最后 grid 為 1 且沒被訪問過的,即為孤島
import collectionsdef bfs(grid, visited, x, y):dirs = [[1, 0], [0, 1], [-1, 0], [0, -1]]m, n = len(grid), len(grid[0])que = collections.deque()que.append([x, y])visited[x][y] = Truewhile que:tmp = que.popleft()cur_x, cur_y = tmp[0], tmp[1]for add_x, add_y in dirs:next_x, next_y = cur_x + add_x, cur_y + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continueif grid[next_x][next_y] and not visited[next_x][next_y]:que.append([next_x, next_y])visited[next_x][next_y] = Truetmp = list(map(int, input().split()))
m, n = tmp[0], tmp[1]
grid = [[0] * n for _ in range(m)]
visited = [[False] * n for _ in range(m)]for i in range(m):tmp = list(map(int, input().split()))for j in range(n):grid[i][j] = tmp[j]for i in range(m):if grid[i][0]:bfs(grid, visited ,i, 0)if grid[i][n-1]:bfs(grid, visited, i, n-1)for j in range(n):if grid[0][j]:bfs(grid, visited, 0, j)if grid[m-1][j]:bfs(grid, visited, m-1, j)for i in range(m):for j in range(n):if grid[i][j] and not visited[i][j]:grid[i][j] = 0for i in range(m):for j in range(n):print(grid[i][j], end=" ")

103. 水流問題

  • 暴力法:直接每個位置 dfs,然后根據其最終是否能到達邊界位置,返回布爾值
  • 優化思路:從邊界出發,逆流而上,最終不能被訪問到的地方為結果
# def dfs(grid, visited, x, y):
#     dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]#     m, n = len(grid), len(grid[0])
#     visited[x][y] = True#     for add_x, add_y in dirs:
#         next_x, next_y = x + add_x, y + add_y
#         if next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:
#             continue
#         if grid[x][y] < grid[next_x][next_y]:
#             continue
#         if not visited[next_x][next_y]:
#             dfs(grid, visited, next_x, next_y)# def isResult(grid, x, y):
#     m, n = len(grid), len(grid[0])
#     visited = [[False] * n for _ in range(m)]
#     dfs(grid, visited, x, y)
#     first_result, second_result = False, False#     for i in range(m):
#         if visited[i][0]:
#             first_result = True
#         if visited[i][n-1]:
#             second_result = True#     for j in range(n):
#         if visited[0][j]:
#             first_result = True
#         if visited[m-1][j]:
#             second_result = True#     return first_result and second_result# tmp = list(map(int, input().split()))
# m, n = tmp[0], tmp[1]# grid = [[0] * n for _ in range(m)]
# for i in range(m):
#     tmp = list(map(int, input().split()))
#     for j in range(n):
#         grid[i][j] = tmp[j]# for i in range(m):
#     for j in range(n):
#         if isResult(grid, i, j):
#             print("{} {}".format(i, j))def dfs(grid, visited, x, y):dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n = len(grid), len(grid[0])visited[x][y] = Truefor add_x, add_y in dirs:next_x, next_y = x + add_x, y + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continue# 等于不行if grid[x][y] > grid[next_x][next_y]:continueif not visited[next_x][next_y]:dfs(grid, visited, next_x, next_y)tmp = list(map(int, input().split()))
m, n = tmp[0], tmp[1]grid = [[0] * n for _ in range(m)]
for i in range(m):tmp = list(map(int, input().split()))for j in range(n):grid[i][j] = tmp[j]   visited_first = [[False]*n for _ in range(m)]
visited_second = [[False]*n for _ in range(m)]for i in range(m):dfs(grid, visited_first, i, 0)dfs(grid, visited_second, i, n-1)for j in range(n):dfs(grid, visited_first, 0, j)dfs(grid, visited_second, m-1, j)for i in range(m):for j in range(n):if visited_first[i][j] and visited_second[i][j]:print("{} {}".format(i, j))

104. 建造最大島嶼

  • 暴力法:直接每個為0的位置,dfs,記錄其面積
  • 優化思路:先記錄每個島嶼的面積,并編號,然后 每個為0的位置,假設其為1,然后加上周圍能訪問到島嶼面積
    • 注意周圍訪問島嶼的去重問題,以及為grid 0的情況
def dfs(grid, mask, x, y, count):dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n = len(grid), len(grid[0])grid[x][y] = maskcount[0] += 1for add_x, add_y in dirs:next_x, next_y = x + add_x, y + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continueif grid[next_x][next_y] != 1 :continuedfs(grid, mask, next_x, next_y, count)def main():tmp = list(map(int, input().split()))m, n = tmp[0], tmp[1]grid = [[0] * n for _ in range(m)]for i in range(m):tmp = list(map(int, input().split()))for j in range(n):grid[i][j] = tmp[j]   mask = 2isAllgrid = TruegridNum = {}for i in range(m):for j in range(n):if grid[i][j] == 0:isAllgrid = Falseif grid[i][j] == 1:count = [0]dfs(grid, mask, i, j, count)gridNum[mask] = count[0]mask += 1if isAllgrid:print(m*n)return result = 0dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]for i in range(m):for j in range(n):if grid[i][j] == 0:tmp = 1visitedGrid = []for add_x, add_y in dirs:next_x, next_y = i + add_x, j + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continueif grid[next_x][next_y] not in visitedGrid and grid[next_x][next_y] != 0:tmp += gridNum[grid[next_x][next_y]]visitedGrid.append(grid[next_x][next_y])result = max(result, tmp)print(result)   main()

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

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

相關文章

k8s學習筆記——k8s升級

前一段時間&#xff0c;由于搭建k8s集群的硬件設備故障&#xff0c;老化導致k8s需要重裝。使用原來的kubeadm安裝方式卻發現裝不了了。查了一下官方文檔&#xff0c;說從v1.24版本之后&#xff0c;kubelet移除了容器引擎&#xff0c;容器及鏡像管理將有第三方工具來接管&#x…

Vue.js有哪些優點和缺點

Vue.js 作為一個流行的前端框架&#xff0c;具有許多優點和一些潛在的缺點。以下是 Vue.js 的一些主要優點和缺點&#xff1a; 優點&#xff1a; 輕量級和靈活性&#xff1a;Vue.js 的核心庫專注于視圖層&#xff0c;這使得它非常輕量級&#xff08;壓縮后只有幾十KB&#xff…

Web 反爬指南

本質上說&#xff0c;防抓的目的在于增加腳本或機器獲取你網站內容的難度&#xff0c;而不要影響真實用戶的使用或搜索引擎的收錄 不幸的是這挺難的&#xff0c;你需要在防抓和降低真實用戶以及搜索引擎的可訪問性之間做一下權衡。 為了防爬&#xff08;也稱為網頁抓取、屏幕…

智譜AI: ChatGLM API的使用

一、獲取API 1、打開網址&#xff1a;智譜AI開放平臺 注冊賬號登錄 2、登錄&#xff0c;查看API key (注冊后贈送100萬token&#xff0c;實名認證后多贈送400萬, 有效期一個) 二、安裝及調用 安裝質譜SDK pip install zhipuai調用方式 流式調用 from zhipuai import ZhipuA…

開放簽電子簽章,讓簽字有跡可循

開放簽&#xff08;企業版&#xff09;V2.0.5版本上線后&#xff0c;系統支持一鍵查詢電子文件的簽署操作記錄&#xff0c;支持一鍵生成詳細的簽署記錄報告&#xff0c;詳細請看下圖&#xff1a; 1、操作記錄詳情&#xff1a; 從合同發起、填寫、簽署、撤銷等環節全流程展示操…

【Linux從入門到放棄】探究進程如何退出以進程等待的前因后果

&#x1f9d1;?&#x1f4bb;作者&#xff1a; 情話0.0 &#x1f4dd;專欄&#xff1a;《Linux從入門到放棄》 &#x1f466;個人簡介&#xff1a;一名雙非編程菜鳥&#xff0c;在這里分享自己的編程學習筆記&#xff0c;歡迎大家的指正與點贊&#xff0c;謝謝&#xff01; 進…

常見反爬及應對

一&#xff0c;特殊混淆的還原 1.1 還原 AAEncode 與 JJEncode AAEncode是一種JavaScript代碼混淆算法&#xff0c;利用它&#xff0c;可以將代碼轉換成 顏文字 表示的JavaScript代碼。 去掉代碼最后的 (‘‘)&#xff0c;這是函數的自調用&#xff0c;去除后就是函數的聲明…

【CSharp】定義結構體并指定字段對齊

【CSharp】定義結構體并指定字段對齊 1.背景2.代碼3.分析1.背景 在 C# 中可以通過 StructLayout 屬性來定義結構體并指定字段對齊方式。 在 C# 中,內存對齊是指數據在內存中的排列方式,使用StructLayout 特性用于控制結構體的內存布局。其特性可以指定字段的內存排列順序(例…

【揭秘】國內十大頂尖AI大模型,引領智能科技新紀元

大模型大模型通常指的是參數量非常大、數據量也非常大的深度學習模型。這些模型由數百萬到數十億甚至更多的參數組成&#xff0c;需要海量的數據和強大的計算資源進行訓練和推理學習的模型。大模型設計的目的在于提高模型的表示能力和性能、應對復雜數據集和任務、提升泛化能力…

6、限界上下文:定義領域邊界的利器

在DDD限界上下文&#xff1a;定義領域邊界的利器領域建模和微服務建設過程中&#xff0c;會有很多項目參與者&#xff0c;包括領域專家、產品經理、項目經理、架構師、開發經理和測試經理等。對于同樣的領域知識&#xff0c;不同的參與者可能會有不同的理解。而且有的時候同一個…

嵌入式學習——硬件(Linux系統在2440上的啟動)——day57

1. Linux2.6系統在s3c2440上的啟動過程分三個階段 1.1 啟動u-boot 1.2 啟動Linux內核 1.3 掛載根文件系統 2. bootloader 2.1 定義 bootloader的本質是一個裸機程序&#xff0c;bootlood專門是為了能夠正確地啟動linux操作系 統&#xff0c;在系統初上電時需要對系統做一些…

BK145FRC10HSK、BK165FRC10HSK電液比例開環控制變量泵放大器

BK15FRC10HAK、BK35FRC10HAK、BK45FRC10HAK、BK55FRC10HAK、BK70FRC10HSK、BK80FRC10HSK、BK90FRC10HSK、BK100FRC10HSK、BK120FRC10HSK、BK145FRC10HSK、BK165FRC10HSK、BK180FRC10HSK電液比例開環控制柱塞泵主要是在傳統的液壓泵基礎上&#xff0c;增加了電液比例控制先導閥。…

從零開始實現大語言模型(二):文本數據處理

1. 前言 神經網絡不能直接處理自然語言文本&#xff0c;文本數據處理的核心是做tokenization&#xff0c;將自然語言文本分割成一系列tokens。 本文介紹tokenization的基本原理&#xff0c;OpenAI的GPT系列大語言模型使用的tokenization方法——字節對編碼(BPE, byte pair en…

重采樣(上采樣或下采樣)是什么?

重采樣&#xff08;Resampling&#xff09;是在數據處理中常用的一種技術&#xff0c;主要用于處理數據集中的不平衡問題。具體來說&#xff0c;重采樣可以分為上采樣&#xff08;Oversampling&#xff09;和下采樣&#xff08;Undersampling&#xff09;&#xff0c;它們分別是…

【bug報錯已解決】ERROR: Could not find a version that satisfies the requirement

&#x1f3ac; 鴿芷咕&#xff1a;個人主頁 &#x1f525; 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想&#xff0c;就是為了理想的生活! 文章目錄 引言一、問題描述1.1 報錯示例1.2 報錯分析 二、解決方法2.1 方法一2.2 方法二 三、總結 引言 有沒有遇到過那種讓人…

軟件開發中常用環境你都知道哪些?

目錄 本地環境&#xff08;Local Environment&#xff0c;簡稱 LOCAL&#xff09; 開發環境&#xff08;Development Environment&#xff0c;簡稱 DEV&#xff09; 測試環境&#xff08;Testing Environment&#xff0c;簡稱 TEST&#xff09; 集成測試環境&#xff08;Sy…

墨烯的C語言技術棧-C語言基礎-003

三.數據類型 1.char // 字符數據型 2.short // 短整型 3.int // 整型 4.long // 長整型 5.long long // 更長的整型 6.float // 單精度浮點數 7.double // 雙精度浮點數 為什么寫代碼? 為了解決生活中的問題 購物,點餐,看電影 為什么有這么多類型呢? 因為說的話都是字符型…

CM-UNet: Hybrid CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation

論文&#xff1a;CM-UNet: Hybrid &#xff1a;CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation 代碼&#xff1a;https://github.com/XiaoBuL/CM-UNet Abstrcat: 由于大規模圖像尺寸和對象變化&#xff0c;當前基于 CNN 和 Transformer 的遙感圖像語義分割方…

mysql 中 單獨獲取已知日期的年月日其中之一

限定條件&#xff1a;2021年8月&#xff0c;寫法有很多種&#xff0c;比如用year/month函數的year(date)2021 and month(date)8&#xff0c;比如用date_format函數的date_format(date, "%Y-%m")"202108"每天&#xff1a;按天分組group by date題目數量&…

java之靜態屬性方法

在java中有一個static的關鍵字&#xff0c;它用來修飾類的成員。如果用static修飾屬性&#xff0c;該屬性被稱為靜態屬性 靜態屬性的訪問格式如下 類名.屬性名 如果沒有修飾靜態屬性示例代碼如下 class Xuesheng1{String name;int age;String school"A大學";publ…