Day53--圖論--106. 島嶼的周長(卡碼網),110. 字符串接龍(卡碼網),105. 有向圖的完全聯通(卡碼網)

Day53–圖論–106. 島嶼的周長(卡碼網),110. 字符串接龍(卡碼網),105. 有向圖的完全聯通(卡碼網)

106. 島嶼的周長(卡碼網)

方法:深搜

思路:

遍歷島嶼的每個節點,每個節點都查找它的四個方向,當觸碰到邊界(邊界是水),或者格子是水的時候,邊長加一。

題目說只有一個島嶼,所以深搜一次就完成了。

import java.util.*;public class Main {// 方向標private static final int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};// 計數器private static int count = 0;// 深搜private static void dfs(int[][] grid, boolean[][] visited, int x, int y) {if (visited[x][y]) {return;}visited[x][y] = true;// 處理本節點,當觸碰到邊界(邊界是水),或者格子是水的時候,邊長加一// 上if (x - 1 < 0 || grid[x - 1][y] == 0) {count++;}// 下if (x + 1 >= grid.length || grid[x + 1][y] == 0) {count++;}// 左if (y - 1 < 0 || grid[x][y - 1] == 0) {count++;}// 右if (y + 1 >= grid[0].length || grid[x][y + 1] == 0) {count++;}// 四個方向for (int i = 0; i < 4; i++) {int nextX = x + dir[i][0];int nextY = y + dir[i][1];if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) {continue;}if (grid[nextX][nextY] == 1) {dfs(grid, visited, nextX, nextY);}}}public static void main(String[] args) {// 錄入數據Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int[][] grid = new int[n][m];boolean[][] visited = new boolean[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {grid[i][j] = in.nextInt();}}// 遍歷矩陣for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && grid[i][j] == 1) {// 題目說只有一個島嶼,深搜一次就搞定了dfs(grid, visited, i, j);break;}}}System.out.println(count);}
}

方法:數學

思路:

  1. 先求島嶼總數sum,如果每一個都是孤島,總邊數 = sum*4
  2. 再求重疊的孤島,每重疊一條邊,邊數減二。重疊cover條,就是減去2*cover
  3. 注意,要避免重復計算。順序遍歷的話,只算左和上就好,不要算右和下。
import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int[][] grid = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {grid[i][j] = in.nextInt();}}int sum = 0;    // 陸地數量int cover = 0;  // 相鄰數量for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 1) {sum++; // 統計總的陸地數量// 統計上邊相鄰陸地if(i - 1 >= 0 && grid[i - 1][j] == 1) cover++;// 統計左邊相鄰陸地if(j - 1 >= 0 && grid[i][j - 1] == 1) cover++;// 為什么沒統計下邊和右邊? 因為避免重復計算}}}System.out.println(sum * 4 - cover * 2);}
}

110. 字符串接龍(卡碼網)

方法:廣搜

思路:

在無權圖中,用廣搜求最短路最為合適,廣搜只要搜到了終點,那么一定是最短的路徑。因為廣搜就是以起點中心向四周擴散的搜索。

枚舉,用26個字母替換當前字符串的每一個字符,在看替換后是否在 wordSet里出現過,就可以判斷兩個字符串是否是鏈接的。

使用visitMap,記錄已訪問的字符串及其路徑長度。

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();String beginStr = in.next();String endStr = in.next();// word集Set<String> wordSet = new HashSet<>();for (int i = 0; i < n; i++) {wordSet.add(in.next());}// 記錄已訪問的字符串及其路徑長度Map<String, Integer> visitMap = new HashMap<>();// 初始化隊列Deque<String> que = new ArrayDeque<>();que.offer(beginStr);// 初始化訪問映射visitMap.put(beginStr, 1);while (!que.isEmpty()) {String word = que.poll();int path = visitMap.get(word);// 逐個字符替換嘗試for (int i = 0; i < word.length(); i++) {// 轉換為字符數組便于修改char[] charArray = word.toCharArray();// 嘗試26個字母for (char c = 'a'; c <= 'z'; c++) {charArray[i] = c;String newWord = new String(charArray);// 找到目標單詞if (newWord.equals(endStr)) {System.out.println(path + 1);return;}// 檢查是否在集合中且未被訪問過if (wordSet.contains(newWord) && !visitMap.containsKey(newWord)) {visitMap.put(newWord, path + 1);que.offer(newWord);}}}}// 無法到達目標單詞System.out.println(0);}
}

105. 有向圖的完全聯通(卡碼網)

方法:廣搜

思路:

可以說是廣搜模板題了。錄入數據之后,用visited數組做訪問標志,廣搜就完成了。

import java.util.*;public class Main {// 鄰接表private static List<List<Integer>> graph = new ArrayList<>();// 訪問標志private static boolean[] visited;// 廣搜private static void bfs(int start) {Deque<Integer> que = new ArrayDeque<>();visited[start] = true;que.offer(start);while (!que.isEmpty()) {int node = que.poll();for (int i : graph.get(node)) {if (!visited[i]) {visited[i] = true;que.offer(i);}}}}// 主函數public static void main(String[] args) {// 錄入數據Scanner in = new Scanner(System.in);int n = in.nextInt();int k = in.nextInt();visited = new boolean[n + 1];for (int i = 0; i <= n; i++) {graph.add(new LinkedList<>());}for (int i = 0; i < k; i++) {int from = in.nextInt();int to = in.nextInt();graph.get(from).add(to);}// 廣搜bfs(1);// 檢查輸出boolean flag = true;for (int i = 1; i <= n; i++) {if (!visited[i]) {flag = false;break;}}if (flag) {System.out.println(1);} else {System.out.println(-1);}}
}

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

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

相關文章

Elasticsearch 數據建模與映射(Mapping)詳解

在 Elasticsearch 中&#xff0c;數據建模與映射&#xff08;Mapping&#xff09; 是決定搜索性能、存儲效率和功能支持的核心環節。合理的映射設計能讓搜索更精準、聚合更高效、存儲更節省。 本文將全面詳解 Elasticsearch 的 數據建模原則、字段類型、動態映射、自定義分析器…

5G工業一體機汽車零部件工廠的無紙化管理

在全球數字化轉型的浪潮中&#xff0c;制造業對信息化、智能化的需求日益強烈。尤其是在汽車零部件領域&#xff0c;生產線的復雜性、質量追溯的苛刻性以及對效率的高要求&#xff0c;迫切需要一種高效、可靠、可擴展的管理模式。以“5G工業一體機”為核心的無紙化管理&#xf…

項目管理工具

1、概述IT 項目生命周期通常可分為啟動、規劃、執行、監控與控制、收尾五個核心階段&#xff0c;每個階段的目標和任務不同&#xff0c;所依賴的工具也各有側重。以下按階段梳理常用工具&#xff0c;涵蓋項目管理、協作、技術開發等多個維度。2、啟動階段&#xff1a;明確項目目…

Linux 進程、線程與 exec/系統調用詳解

1. wait 與 waitpid —— 子進程資源回收1.1 waitpid_t wait(int *wstatus);功能&#xff1a;阻塞等待&#xff0c;回收任意子進程的資源空間。參數&#xff1a;wstatus&#xff1a;保存子進程退出狀態的變量地址NULL&#xff1a;不保存退出狀態返回值&#xff1a;成功&#xf…

Laravel 使用ssh鏈接遠程數據庫

1.創建ssh ssh -i ./id_rsa -N -L 13306:127.0.0.1:3306 -p 22 root***對上述代碼的解釋&#xff1a; 命令是一個SSH隧道命令&#xff0c;用于將本地端口3306轉發到遠程服務器上的3306端口。以下是命令的詳細解釋&#xff1a;# 調用SSH客戶端。 ssh # 指定用于身份驗證的私鑰文…

Python延申內容(一)

1.技術面試題 &#xff08;1&#xff09;TCP與UDP的區別是什么&#xff1f; 答&#xff1a; TCP&#xff08;傳輸控制協議&#xff09;&#xff1a;面向連接、可靠傳輸&#xff08;數據完整有序&#xff09;、流量控制、擁塞控制&#xff0c;適用于文件傳輸、網頁瀏覽等場景。 …

Java 9 新特性及具體應用

目錄 1. 模塊系統&#xff08;Jigsaw&#xff09; 2. JShell&#xff08;REPL工具&#xff09; 3. 集合工廠方法 4. 接口私有方法 5. Stream API 增強 6. HTTP/2 客戶端&#xff08;Incubator&#xff09; 7. 多版本JAR包 總結 1. 模塊系統&#xff08;Jigsaw&#xff0…

第二十五天:構造函數/析構函數/拷貝構造

構造函數/析構函數/拷貝構造 1. 構造函數&#xff08;Constructor&#xff09; 定義與作用&#xff1a;構造函數是一種特殊的成員函數&#xff0c;其名稱與類名相同&#xff0c;沒有返回類型&#xff08;包括 void 也沒有&#xff09;。它的主要作用是在創建對象時初始化對象的…

【P14 3-6 】OpenCV Python——視頻加載、攝像頭調用、視頻基本信息獲取(寬、高、幀率、總幀數),視頻保存在指定位置

文章目錄1 讀取本地視頻1.1 絕對路徑 6種方式1.2 相對路徑 4種方式1.3 讀取本地視頻2 視頻基本信息3 調用攝像頭 并將視頻保存在指定位置P14 3-6 1 讀取本地視頻 現在要讀取本地視頻“video.mp4”&#xff0c; 視頻文件“video.mp4”和playVideo.py腳本文件&#xff0c;都在…

【DL學習筆記】常用數據集總結

一、如何找數據集 paperswithcode&#xff0c;但好像沒了 AutoDL Roboflow Kaggle Hungging Face 百度飛漿PP AIStudio 二、目標檢測數據集格式 常用數據集坐標格式 MSCOCO &#xff1a; 坐標格式&#xff08;x&#xff0c;y&#xff0c;w&#xff0c;h&#xff…

19.3 Transformers量化模型極速加載指南:4倍推理加速+75%顯存節省實戰

Transformers量化模型極速加載指南:4倍推理加速+75%顯存節省實戰 實戰項目:模型量化 Transformers 兼容性配置 量化模型加載核心配置邏輯 #mermaid-svg-rDjfMigtxckLYWp3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

Android 終端接入 GB28181 國標視頻平臺的完整解決方案解析

1. 引言&#xff1a;讓 Android 終端無縫融入國標視頻網絡在公安、交通、應急、工業、教育等領域&#xff0c;GB/T 28181 國標協議早已成為視頻監控與指揮調度的事實標準。傳統國標視頻網絡通常由固定部署的 IPC 攝像機、NVR、視頻管理平臺構成&#xff0c;設備形態單一。隨著一…

Docker目錄的遷移

# 遷移 docker 目錄 &#xff08;無論容器與鏡像占用空間大小&#xff0c;哪怕只占用1G&#xff0c;也需用此方式&#xff0c;否則可能遷移不成功&#xff09;service docker stopcd /var/lib/docker# 一個一個復制除 overlay2 外的其他所有文件夾cp -R builder /home/docker/l…

IOS APP 前端存儲

UserDefaults優點簡單易用提供簡單的鍵值對存儲接口無需復雜配置&#xff0c;開箱即用適合存儲少量簡單數據輕量級專門為存儲小量數據設計內存占用小性能開銷低自動持久化數據自動保存到磁盤應用重啟后數據仍然可用通過synchronize()方法可以強制立即寫入&#xff08;iOS 12已自…

在前端js中使用jsPDF或react-to-pdf生成pdf文件時,不使用默認下載,而是存儲到服務器

開源地址&#xff1a; https://github.com/ivmarcos/react-to-pdf 主要就是這個方法&#xff0c;有三種可選&#xff1a; 默認是save&#xff0c;也就是會自動觸發下載的方法&#xff0c;open方法是默認會打開一個pdf預覽的tab頁面&#xff0c;build方法就是在調用的函數gener…

會議征稿!IOP出版|第二屆人工智能、光電子學與光學技術國際研討會(AIOT2025)

往屆已EI檢索&#xff0c;歡迎投稿&#xff01; AIOT2024會后兩個月實現見刊&#xff01; AIOT2025已通過IOP-JPCS出版申請&#xff0c;獨立JPCS出版 AIOT2025已上線西安文理學院官網&#xff1a; 征文通知&#xff5c;第二屆人工智能、光電子學與光學技術國際…

CPP多線程2:多線程競爭與死鎖問題

在多線程編程中&#xff0c;多個線程協同工作能顯著提升程序效率&#xff0c;但當它們需要共享和操作同一資源時&#xff0c;潛在的問題也隨之而來&#xff1b;線程間的執行順序不確定性可能導致資源競爭&#xff0c;可能引發死鎖&#xff0c;讓程序陷入停滯。 多線程競爭問題示…

全國產飛騰d2000+復旦微690t信號處理模塊

UD VPX-404是基于高速模擬/數字采集回放、FPGA信號實時處理、CPU主控、高速SSD實時存儲架構開發的一款高度集成的信號處理組合模塊&#xff0c;采用6U VPX架構&#xff0c;模塊裝上外殼即為獨立整機&#xff0c;方便用戶二次開發。 UD VPX-404模塊的國產率可達到100%&#xff0…

物聯網 (IoT) 的頂級硬件平臺

物聯網 &#xff08;IoT&#xff09; 的頂級硬件平臺IoT&#xff08;物聯網&#xff09;不再是一個流行詞。隨著每天出現幾個鼓舞人心的用例&#xff0c;多家公司現在正在探索如何利用該技術實現業務增長。無論實施何種其他技術&#xff0c;基于物聯網的新設備正迅速成為一項重…

TCP傳輸層協議(4)

TCP應用層協議&#xff08;4&#xff09; 流量控制 接收端處理數據的速度是有限的. 如果發送端發的太快, 導致接收端的緩沖區被打滿, 這個時候如果發送端繼續發送, 就會造成丟包, 繼而引起丟包重傳等等一系列連鎖反應. 因此 TCP 支持根據接收端的處理能力, 來決定發送端的發送速…