代碼隨想錄-算法訓練營-番外(圖論02:島嶼數量,島嶼的最大面積)

day02 圖論part02
今日任務:島嶼數量,島嶼的最大面積
都是一個模子套出來的
https://programmercarl.com/kamacoder/0099.島嶼的數量深搜.html#思路往日任務:
day01 圖論part01 
今日任務:圖論理論基礎/所有可到達的路徑
代碼隨想錄圖論視頻部分還沒更新
https://programmercarl.com/kamacoder/圖論理論基礎.html#圖的基本概念

day02

島嶼數量

dfs

?import java.util.Scanner;?public class Main{public static int[][] dir ={{0,1},{1,0},{-1,0},{0,-1}};public static void main(String[] args){Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();int[][] grid = new int[m][n];for(int i = 0 ; i < m; i++){for(int j = 0; j < n; j++){grid[i][j] = sc.nextInt();}}boolean[][] visited = new boolean[m][n];int count = 0;for(int i = 0 ; i < m; i++){for(int j = 0; j < n; j++){if( visited[i][j] == false && grid[i][j] == 1){count++;visited[i][j] = true;//訪問過了dfs(grid,i,j,visited);//一直找臨近陸地直到找不到}}}System.out.println(count);}private static void dfs(int[][] grid,int x,int y,boolean[][] visited){for(int i = 0; i < 4; i++){//x += dir[i][0];//這里錯了,x和y需要用四次,可是剛用一次值就改變了//y += dir[i][1];int x1 = x + dir[i][0];int y1 = y + dir[i][1];if(x1<0||y1<0||x1>= grid.length||y1>=grid[0].length)continue;//越界則繼續判斷下一個旁邊的位置if(!visited[x1][y1] && grid[x1][y1]==1)//旁邊是沒遇到過的陸地{visited[x1][y1]=true;dfs(grid,x1,y1,visited);//繼續找臨近陸地}}}}

bfs

main方法一樣,dfs和bfs有細微的差別,dfs是遇到陸地就遞歸直到越界,bfs是遇到陸地就加到queue里面直到queue為空

linkedlist實現queue,用到了isEmpty方法,peek方法和poll方法

?import java.util.*;public class Main {public static int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};//下右上左逆時針遍歷?public static void bfs(int[][] grid, boolean[][] visited, int x, int y) {Queue<pair> queue = new LinkedList<pair>();//定義坐標隊列,沒有現成的pair類,在下面自定義了queue.add(new pair(x, y));//第一個位置入隊visited[x][y] = true;//遇到入隊直接標記為優先,// 否則出隊時才標記的話會導致重復訪問,比如下方節點會在右下順序的時候被第二次訪問入隊while (!queue.isEmpty()) {int curX = queue.peek().first;int curY = queue.poll().second;//當前橫縱坐標for (int i = 0; i < 4; i++) {//順時針遍歷新節點next,下面記錄坐標int nextX = curX + dir[i][0];int nextY = curY + dir[i][1];if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) {continue;}//去除越界部分if (!visited[nextX][nextY] && grid[nextX][nextY] == 1) {queue.add(new pair(nextX, nextY));visited[nextX][nextY] = true;//邏輯同上}}}}?public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();int[][] grid = new int[m][n];boolean[][] visited = new boolean[m][n];int ans = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {grid[i][j] = sc.nextInt();}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!visited[i][j] && grid[i][j] == 1) {ans++;bfs(grid, visited, i, j);}}}System.out.println(ans);}// 定義 pair 類來表示坐標public static class pair {int first; // 橫坐標int second; // 縱坐標?// 構造函數public pair(int x, int y) {this.first = x;this.second = y;}}}

島嶼的最大面積

dfs

套島嶼數量的模板,變化很少(話說這道題怎么沒有答案啊)

?import java.util.Scanner;public class Main{public static int count;//這里變了public static int[][] dir ={{0,1},{1,0},{-1,0},{0,-1}};public static void main(String[] args){Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();int[][] grid = new int[m][n];for(int i = 0 ; i < m; i++){for(int j = 0; j < n; j++){grid[i][j] = sc.nextInt();}}boolean[][] visited = new boolean[m][n];int result = 0;//這里變了for(int i = 0 ; i < m; i++){for(int j = 0; j < n; j++){if( visited[i][j] == false && grid[i][j] == 1){count = 1;visited[i][j] = true;dfs(grid,i,j,visited);result = Math.max(result, count);//這里變了}}}System.out.println(result);//這里變了}private static void dfs(int[][] grid,int x,int y,boolean[][] visited){for(int i = 0; i < 4; i++){int x1 = x + dir[i][0];int y1 = y + dir[i][1];if(x1<0||y1<0||x1>= grid.length||y1>=grid[0].length)continue;if(!visited[x1][y1] && grid[x1][y1]==1){visited[x1][y1]=true;count++;//這里變了dfs(grid,x1,y1,visited);}}}}

bfs

套模版,基本沒變化

?import java.util.*;?public class Main {public static int count;//多了這一行public static int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};?public static void bfs(int[][] grid, boolean[][] visited, int x, int y) {Queue<pair> queue = new LinkedList<pair>();queue.add(new pair(x, y));visited[x][y] = true;?while (!queue.isEmpty()) {int curX = queue.peek().first;int curY = queue.poll().second;for (int i = 0; i < 4; i++) {int nextX = curX + dir[i][0];int nextY = curY + dir[i][1];if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) {continue;}if (!visited[nextX][nextY] && grid[nextX][nextY] == 1) {queue.add(new pair(nextX, nextY));visited[nextX][nextY] = true;count++;//多了這一行}}}}?public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();int[][] grid = new int[m][n];boolean[][] visited = new boolean[m][n];int result = 0;//這里for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {grid[i][j] = sc.nextInt();}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!visited[i][j] && grid[i][j] == 1) {count = 1;bfs(grid, visited, i, j);result = Math.max(result, count);//這里}}}System.out.println(result);}public static class pair {int first; int second;public pair(int x, int y) {this.first = x;this.second = y;}}}

感謝大佬分享:

代碼隨想錄算法訓練營第五十一天|Day51 圖論-CSDN博客

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

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

相關文章

RabbitMQ個人理解與基本使用

目錄 一. 作用&#xff1a; 二. RabbitMQ的5中隊列模式&#xff1a; 1. 簡單模式 2. Work模式 3. 發布/訂閱模式 4. 路由模式 5. 主題模式 三. 消息持久化&#xff1a; 消息過期時間 ACK應答 四. 同步接收和異步接收&#xff1a; 應用場景 五. 基本使用 &#xff…

前端怎么預覽pdf

1.背景 后臺返回了一個在線的pdf地址&#xff0c;需要我這邊去做一個pdf的預覽&#xff08;需求1&#xff09;&#xff0c;并且支持配置是否可以下載&#xff08;需求2&#xff09;&#xff0c;需要在當前頁就能預覽&#xff08;需求3&#xff09;。之前我寫過一篇預覽pdf的文…

Python 參數配置使用 XML 文件的教程:輕松管理你的項目配置

Python 參數配置使用 XML 文件的教程&#xff1a;輕松管理你的項目配置 一句話總結&#xff1a;當配置項存儲在外部文件&#xff08;如 XML、JSON&#xff09;時&#xff0c;修改配置無需重新編譯和發布代碼。通過更新 XML 文件即可調整參數&#xff0c;無需更改源代碼&#xf…

解決 MySQL 啟動失敗與大小寫問題,重置數據庫

技術文檔&#xff1a;解決 MySQL 啟動失敗與大小寫問題&#xff0c;重置數據庫 1. 問題背景 在使用 MySQL 時&#xff0c;可能遇到以下問題&#xff1a; MySQL 啟動失敗&#xff0c;日志顯示 “permission denied” 或 “Can’t create directory” 錯誤。MySQL 在修改配置文…

python webdriver-manager 實現selenium 免下載安裝webdriver

python webdriver-manager 實現selenium 免下載安裝webdriver selenium在自動化測試中,通常需要使用瀏覽器驅動來與瀏覽器進行交互。然而,手動下載、安裝、以及管理這些驅動非常麻煩,尤其是當驅動版本頻繁更新時。為此,webdriver-manager庫提供了一個極簡的方案,自動幫我…

滑動窗口算法專題

滑動窗口簡介 滑動窗口就是利用單調性&#xff0c;配合同向雙指針來優化暴力枚舉的一種算法。 該算法主要有四個步驟 1. 先進進窗口 2. 判斷條件&#xff0c;后續根據條件來判斷是出窗口還是進窗口 3. 出窗口 4.更新結果&#xff0c;更新結果這個步驟是不確定的&#xff0c…

C# 中的Task

文章目錄 前言一、Task 的基本概念二、創建 Task使用異步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 關鍵字使用 Task.Wait 方法 四、處理 Task 的異常使用 try-catch 塊使用 Task.Exception 屬性 五、Task 的延續使用 ContinueWith 方法使用 await 關鍵字和異步方法…

【AIGC】如何高效使用ChatGPT挖掘AI最大潛能?26個Prompt提問秘訣幫你提升300%效率的!

還記得第一次使用ChatGPT時&#xff0c;那種既興奮又困惑的心情嗎&#xff1f;我是從一個對AI一知半解的普通用戶&#xff0c;逐步成長為現在的“ChatGPT大神”。這一過程并非一蹴而就&#xff0c;而是通過不斷的探索和實踐&#xff0c;掌握了一系列高效使用的技巧。今天&#…

浩辰CAD教程004:柱梁板

文章目錄 柱梁板標準柱角柱構造柱柱齊墻邊繪制梁繪制樓板 柱梁板 標準柱 繪制標準柱&#xff1a; ①&#xff1a;點選插入柱子②&#xff1a;沿著一根軸線布置柱子③&#xff1a;指定的矩形區域內的軸線交點插入柱子 替換現有柱子&#xff1a;選擇替換之后的柱子形狀&#x…

UNIX數據恢復—UNIX系統常見故障問題和數據恢復方案

UNIX系統常見故障表現&#xff1a; 1、存儲結構出錯&#xff1b; 2、數據刪除&#xff1b; 3、文件系統格式化&#xff1b; 4、其他原因數據丟失。 UNIX系統常見故障解決方案&#xff1a; 1、檢測UNIX系統故障涉及的設備是否存在硬件故障&#xff0c;如果存在硬件故障&#xf…

橋接模式的理解和實踐

橋接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;又稱橋梁模式&#xff0c;是一種結構型設計模式。它的核心思想是將抽象部分與實現部分分離&#xff0c;使它們可以獨立地進行變化&#xff0c;從而提高系統的靈活性和可擴展性。本文將詳細介紹橋接模式的概念、原理…

HTML綜合

一.HTML的初始結構 <!DOCTYPE html> <html lang"en"><head><!-- 設置文本字符 --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 設置網頁…

二維碼數據集,使用yolov,voc,coco標注,3044張各種二維碼原始圖片(未圖像增強)

二維碼數據集&#xff0c;使用yolov&#xff0c;voc&#xff0c;coco標注&#xff0c;3044張各種二維碼原始圖片&#xff08;未圖像增強&#xff09; 數據集分割 訓練組70&#xff05; 2132圖片 有效集20&#xff05; 607圖片 測試集10&#xff05; 305圖…

Python爬蟲技術的最新發展

在互聯網的海洋中&#xff0c;數據就像是一顆顆珍珠&#xff0c;而爬蟲技術就是我們手中的潛水艇。2024年&#xff0c;爬蟲技術有了哪些新花樣&#xff1f;讓我們一起潛入這個話題&#xff0c;看看最新的發展和趨勢。 1. 異步爬蟲&#xff1a;速度與激情 隨著現代Web應用的復…

用豆包MarsCode IDE,從0到1畫出精美數據大屏!

豆包MarsCode IDE 是一個云端 AI IDE 平臺&#xff0c;通過內置的 AI 編程助手&#xff0c;開箱即用的開發環境&#xff0c;可以幫助開發者更專注于各類項目的開發。 作為一名前端開發工程師&#xff0c;今天想嘗試利用豆包MarsCode IDE&#xff0c;選擇 Vue Echarts 創建一個…

游戲引擎學習第42天

倉庫: https://gitee.com/mrxiao_com/2d_game 簡介 目前我們正在研究的內容是如何構建一個基本的游戲引擎。我們將深入了解游戲開發的每一個環節&#xff0c;從最基礎的技術實現到高級的游戲編程。 角色移動代碼 我們主要討論的是角色的移動代碼。我一直希望能夠使用一些基…

Redis是什么?Redis和MongoDB的區別在那里?

Redis介紹 Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、基于內存的數據結構存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。以下是關于Redis的詳細介紹&#xff1a; 一、數據結構支持 字符串&#xff08;String&#xff09; 這是Redis最…

計算機網絡中的三大交換技術詳解與實現

目錄 計算機網絡中的三大交換技術詳解與實現1. 計算機網絡中的交換技術概述1.1 交換技術的意義1.2 三大交換技術簡介 2. 電路交換技術2.1 理論介紹2.2 Python實現及代碼詳解2.3 案例分析 3. 分組交換技術3.1 理論介紹3.2 Python實現及代碼詳解3.3 案例分析 4. 報文交換技術4.1 …

[Python] 操作redis使用pipeline保證原子性

1. pipeline介紹 在Python中使用Redis的Pipeline可以使多個Redis命令在一個請求中批量執行&#xff0c;從而提高效率。redis-py庫提供了對Redis Pipeline的支持&#xff0c;下面是一個基本的例子&#xff1a; 首先&#xff0c;確保你已安裝了redis庫&#xff1a; pip instal…

Bug 解決 無法正常登錄或獲取不到用戶信息

目錄 1、跨域問題 2、后端代碼問題 3、前端代碼問題 我相信登錄這個功能是很多人做項目時候遇到第一個檻&#xff01; **看起來好像很簡單的登錄功能&#xff0c;實際上還是有點坑的&#xff0c;比如明明賬號密碼都填寫正確了&#xff0c;**為什么登錄后請求接口又說我沒登…