代碼隨想錄算法訓練營第五十二天|圖論part3

101. 孤島的總面積

題目鏈接:101. 孤島的總面積

文章講解:代碼隨想錄

思路:

與島嶼面積差不多,區別是再dfs的時候,如果碰到越界的,需要用一個符號標記這不是孤島再continue

#include <iostream>
#include <vector>
using namespace std;int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(vector<vector<int>>graph,vector<vector<bool>>&visited,int &area,int x,int y,bool& isGudao){for(int i=0;i<4;i++){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if(nextx<1||nextx>=graph.size()||nexty<1||nexty>=graph[0].size()){isGudao=false;  //標記不是孤島continue;}if(graph[nextx][nexty]&&!visited[nextx][nexty]){   //發現島嶼      area++;visited[nextx][nexty]=true;dfs(graph,visited,area,nextx,nexty,isGudao);    }}
}int main(){int n,m;cin>>n>>m;vector<vector<int>>graph(n+1,vector<int>(m+1,0));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>graph[i][j];}}int result=0;vector<vector<bool>>visited(n+1,vector<bool>(m+1,false));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(graph[i][j]&&!visited[i][j]){   //發現島嶼visited[i][j]=true;int area=1;bool isGudao=true;dfs(graph,visited,area,i,j,isGudao);if(isGudao)result+=area;}}}cout<<result<<endl;
}

102. 沉沒孤島

題目鏈接:102. 沉沒孤島

文章講解:代碼隨想錄

思路:

與上體差不多,添加一個變量record? 本次深搜或廣搜遍歷到的島嶼

main函數中dfs結束后 得到是不是孤島 如果是孤島 record里的坐標全部標為0?

#include <iostream>
#include <vector>
using namespace std;int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(vector<vector<int>>graph,vector<vector<bool>>&visited,int x,int y,bool& isGudao,vector<pair<int,int>>&record){for(int i=0;i<4;i++){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if(nextx<1||nextx>=graph.size()||nexty<1||nexty>=graph[0].size()){isGudao=false;continue;}if(graph[nextx][nexty]&&!visited[nextx][nexty]){   //發現島嶼      visited[nextx][nexty]=true;record.push_back({nextx,nexty});dfs(graph,visited,nextx,nexty,isGudao,record);    }}
}int main(){int n,m;cin>>n>>m;vector<vector<int>>graph(n+1,vector<int>(m+1,0));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>graph[i][j];}}vector<vector<bool>>visited(n+1,vector<bool>(m+1,false));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(graph[i][j]&&!visited[i][j]){   //發現島嶼visited[i][j]=true;vector<pair<int,int>>record;   //記錄本片島嶼record.push_back({i,j});bool isGudao=true;dfs(graph,visited,i,j,isGudao,record);if(isGudao){for(int k=0;k<record.size();k++){graph[record[k].first][record[k].second]=0;}}}}}//輸出for(int i=1;i<=n;i++){for(int j=1;j<m;j++){cout<<graph[i][j]<<' ';}cout<<graph[i][m]<<endl;}
}

103.水流問題

題目鏈接:103. 水流問題

文章講解:創作中心-CSDN

思路:

用逆向思維,從第一邊界出發,水往高處流看能經過哪些節點

從第二邊界出發,水往高處流 看能經過哪些節點

然后求第一邊界出發經過的節點與第二邊界出發經過的節點的交集

#include <iostream>
#include <vector>
using namespace std;int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
void dfs(vector<vector<int>>graph,vector<vector<bool>>&record,int x,int y){record[x][y]=true;for(int i=0;i<4;i++){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if(nextx<0||nextx>=graph.size()||nexty<0||nexty>=graph[0].size()){continue;}if(!record[nextx][nexty]&&graph[nextx][nexty]>=graph[x][y]){dfs(graph,record,nextx,nexty);}}}int main(){int n,m;cin>>n>>m;vector<vector<int>>graph(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>graph[i][j];}}vector<vector<bool>>record1(n,vector<bool>(m,false));vector<vector<bool>>record2(n,vector<bool>(m,false));//從第一邊界出發for(int i=0;i<n;i++){dfs(graph,record1,i,0);}for(int j=0;j<m;j++){dfs(graph,record1,0,j);}//從第二邊界出發for(int i=0;i<n;i++){dfs(graph,record2,i,m-1);}for(int j=0;j<m;j++){dfs(graph,record2,n-1,j);}//求交for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(record1[i][j]&&record2[i][j]){cout<<i<<' '<<j<<endl;}}}}

104.建造最大島嶼

題目鏈接:104. 建造最大島嶼

文章講解:代碼隨想錄

思路:

第一步 統計每塊島嶼的面積

第二步 遍歷所有海洋 相鄰島嶼面積加起來?

求最大值

set查找用count

插入用insert

還要考慮全陸地的情況

?

#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>using namespace std;
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};void dfs(vector<vector<int>>&graph,vector<vector<bool>>&visited,int x,int y,int mark,int &count){visited[x][y]=true;count++;graph[x][y]=mark;for(int i=0;i<4;i++ ){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if (nextx<0 || nexty<0 || nextx >=graph.size() || nexty>=graph[0].size())continue;if(!visited[nextx][nexty]&&graph[nextx][nexty]!=0){dfs(graph,visited,nextx,nexty,mark,count);}}
}int main(){int n,m;cin>>n>>m;vector<vector<int>>graph(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>graph[i][j];}}//統計每塊島嶼的面積  并且每塊島嶼賦予一個編號vector<vector<bool>>visited(n,vector<bool>(m,0));int mark=2;unordered_map<int,int>mymap;bool isAllGrid=true;for(int i=0;i<n;i++){for(int j=0;j<m;j++){int count=0;if(graph[i][j]==0)isAllGrid=false;if(!visited[i][j]&&graph[i][j]==1){dfs(graph,visited,i,j,mark,count);mymap[mark] = count; mark++;}}}//遍歷所有海洋  統計海洋相鄰島嶼信息int result=0;unordered_set<int>myset;for(int i=0;i<n;i++){for(int j=0;j<m;j++){myset.clear();if(graph[i][j]==0){int currentRes=0;for(int k=0;k<4;k++){int nextx=i+dir[k][0];int nexty=j+dir[k][1];if(nextx<0||nexty<0||nextx>=graph.size()||nexty>graph[0].size()) continue;if(!myset.count(graph[nextx][nexty])&&graph[nextx][nexty]!=0){currentRes+=mymap[graph[nextx][nexty]];myset.insert(graph[nextx][nexty]);   result=max(result,currentRes);}}}}}if(isAllGrid){cout<<n*m;}else{cout<<result+1;}return 0;}

?

?

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

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

相關文章

前端實現 excel 數據導出,封裝方法支持一次導出多個Sheet

一、前言 后臺管理項目有時會有需要前端導出excel表格的功能&#xff0c;有時還需要導出多個sheet&#xff0c;并給每個sheet重新命名&#xff0c;下面我們就來實現一下。 二、實現效果圖 三、實現步驟 1、 安裝 命令行安裝 xlsx 和 file-saver npm install xlsx -S npm i…

【Lambda 表達式】返回值為什么是auto

一個例子&#xff1a; int x 10; auto add_x [x](int y) -> int {return x y; }; int result add_x(5); // 結果是 15lambda 是匿名類型&#xff0c;必須用 auto 來接收。&#xff08;必須寫auto&#xff0c;不可省略&#xff09;內層 -> auto 是函數的返回類型自動推…

【小董談前端】【樣式】 CSS與樣式庫:從實現工具到設計思維的跨越

CSS與樣式庫&#xff1a;從實現工具到設計思維的跨越 一、CSS的本質&#xff1a;樣式實現的「施工隊」 CSS作為網頁樣式的描述語言&#xff0c;其核心能力在于&#xff1a; 精確控制元素的尺寸、位置、顏色實現響應式布局和動畫效果與HTML/JavaScript協同完成交互體驗 但CS…

MTSC2025參會感悟:大模型 + CV 重構全終端 UI 檢測技術體系

目錄 一、傳統 UI 自動化的困局:高成本與低效率的雙重枷鎖 1.1 根深蒂固的技術痛點 1.2 多維度質量挑戰的疊加 二、Page eyes 1.0:純視覺方案破解 UI 檢測困局 2.1 純視覺檢測的核心理念 2.2 頁面加載完成的智能判斷 2.3 視覺模型驅動的異常檢測 2.4 大模型賦能未知異…

使用Claude Code從零到一打造一個現代化的GitHub Star項目管理器

在日常的開發工作中&#xff0c;我們經常會在GitHub上star一些有用的項目庫。隨著時間的推移&#xff0c;star的項目越來越多&#xff0c;如何有效管理這些項目成為了一個痛點。 今天&#xff0c;分享我使用Claude Code從零構建的一個GitHub Star管理插件。項目背景與需求分析 …

為什么 Linux 啟動后還能升級內核?

? 為什么 Linux 啟動后還能升級內核&#xff1f; 簡單結論&#xff1a; 因為 “安裝/升級內核 ≠ 當前就使用該內核”&#xff0c;Linux允許你安裝多個內核版本&#xff0c;并在下次啟動時選擇其中一個來加載運行。 &#x1f9e0; 舉個現實生活類比 你在穿一件衣服&#xff08…

Go語言實戰案例-統計文件中每個字母出現頻率

以下是《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例19&#xff1a;統計文件中每個字母出現頻率 的完整內容。本案例適合用來練習文件讀取、字符處理、map統計等基礎技能。&#x1f3af; 案例目標讀取一個本地文本文件&#xff0c;統計并打印出其中每個英文字母&#xff…

Notepad++工具操作技巧

1、notepad -> ctrlf -> 替換(正則表達式) -> $-a ->每行的行尾加a&#xff1b; 2、notepad -> ctrlf -> 替換(正則表達式) -> ^-a ->每行的行首加a &#xff1b; 3、按住alt切換為列模式 4、刪除空行-不包括有空格符號的空行 查找替代 查找目標…

領碼課堂 | Java與AI的“硬核“交響曲:當企業級工程思維遇上智能時代

摘要 &#x1f680; 在AI工業化落地的深水區&#xff0c;Java正以其獨特的工程化優勢成為中流砥柱。本文系統解構Java在AI項目全生命周期中的技術矩陣&#xff0c;通過"三階性能優化模型"、"微服務化AI部署架構"等原創方法論&#xff0c;結合大模型部署、M…

面經 - 基于Linux的高性能在線OJ平臺

真實面試環境中&#xff0c;被問到的相關問題&#xff0c;感興趣的可以看下1. 這個項目是你獨立完成的嗎&#xff1f;團隊中你的職責是什么&#xff1f;是的&#xff0c;這個項目是我獨立完成的&#xff0c;從需求分析、系統設計到項目部署都我做的。重點工作包括&#xff1a;使…

Ubuntu 20.04 上安裝 SPDK

以下是在 Ubuntu 20.04 上安裝 SPDK (Storage Performance Development Kit) 的完整步驟&#xff1a;1. 系統準備# 更新系統 sudo apt update sudo apt upgrade -y# 安裝基礎依賴 sudo apt install -y git make gcc g libssl-dev libaio-dev libnuma-dev \pkg-config python3 p…

解決WPS圖片在Excel表格中無法打開

若出現無法打開的情況&#xff0c;還請回到WPS中&#xff0c;點擊圖片&#xff0c;右鍵&#xff1a;轉化為浮動圖片保存&#xff0c;然后便能正常打開&#xff01;

【Ollama】open-webui部署模型

目錄 一、本地部署Ollama 1.1 進入官網復安裝命令 1.2 執行安裝命令 1.3 驗證是否安裝成功 二、啟動Ollama服務 三、運行模型 方法一&#xff1a;拉取模型鏡像 方法二&#xff1a;拉取本地模型 四、使用Open WebUI 部署模型 4.1 創建虛擬環境 4.2 安裝依賴 4.3 運行…

C#文件操作(創建、讀取、修改)

判斷文件是否存在 不存在則創建默認文件 并寫入默認值/// <summary>/// 判斷文件是否存在 不存在則創建默認文件 并寫入默認值/// </summary>public void IsConfigFileExist(){try{// 獲取應用程序的當前工作目錄。string fileName System.IO.Directory.GetCurr…

基于阿里云平臺的文章評價模型訓練與應用全流程指南

基于阿里云平臺的文章評價模型訓練與應用全流程指南 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 1. 項目概述 1.1 項目背景 在當今信息爆炸的時代&…

AI 及開發領域動態與資源匯總(2025年7月24日)

AI 項目、工具及動態匯總 項目/產品名稱核心功能/簡介主要特點/亮點相關鏈接Supervision一個流行的計算機視覺工具庫&#xff0c;用于加速計算機視覺應用的構建。模型無關&#xff0c;可與多種主流庫集成&#xff1b;提供豐富的可定制標注工具&#xff1b;支持多種數據集操作和…

C專題8:文件操作1

1.C語言中的文件是什么?所謂文件&#xff08;file&#xff09;一般指存儲在外部介質上數據的集合&#xff0c;比如我們經常使用的txt、bmp、jpg、exe、rmvb等等。這些文件各有各的用途&#xff0c;我們通常將它們存放在磁盤或者可移動盤等介質中。文件無非就是一段數據的集合&…

Opencv C# 重疊 粘連 Overlap 輪廓分割 (不知道不知道)

先上效果圖一種基于凹陷檢測重疊輪廓分割的方法這兩個星期壓力大的一批&#xff0c;心臟都給干得亂跳了&#xff0c;現在高血壓心率不齊貧血。兄弟們保重身體啊。簡單說下邏輯&#xff1a;前處理&#xff1a;的噼里啪啦我就不說了&#xff0c;根據樣品來(灰度&#xff0c;濾波&…

CentOS7 安裝 rust 1.82.0

CentOS7 安裝 rust 1.82.0 我在CentOS7.9中安裝rust遇到報錯版本低&#xff0c;再升級版本的過程中遇到諸多問題&#xff0c;簡單記錄。 遇到的問題 提示版本低 centos7 安裝 ERROR: Rust 1.75.0 or newer required.Rust version 1.72.1 was found.原因是 CentOS7 的默認的軟件…

Compose 適配 - 鍵鼠模式

一、概念不止觸摸交互&#xff0c;在 ChromeOS 或外接鍵鼠的設備上&#xff0c;需要考慮焦點、懸停、右鍵等操作邏輯。二、使用2.1 焦點使用 Tab 鍵來導航&#xff0c;改變邊框以提供清晰的焦點指示器。Composable fun Demo() {val interactionSource remember { MutableInter…