LeetCode算法題(Go語言實現)_47

題目

給你一個 m x n 的迷宮矩陣 maze (下標從 0 開始),矩陣中有空格子(用 ‘.’ 表示)和墻(用 ‘+’ 表示)。同時給你迷宮的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一開始所在格子的行和列。
每一步操作,你可以往 上,下,左 或者 右 移動一個格子。你不能進入墻所在的格子,你也不能離開迷宮。你的目標是找到離 entrance 最近 的出口。出口 的含義是 maze 邊界 上的 空格子。entrance 格子 不算 出口。
請你返回從 entrance 到最近出口的最短路徑的 步數 ,如果不存在這樣的路徑,請你返回 -1 。

一、代碼實現

func nearestExit(maze [][]byte, entrance []int) int {m := len(maze)if m == 0 {return -1}n := len(maze[0])if n == 0 {return -1}entranceRow, entranceCol := entrance[0], entrance[1]queue := [][]int{{entranceRow, entranceCol}}maze[entranceRow][entranceCol] = '+' // 標記為已訪問directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}steps := 0for len(queue) > 0 {levelSize := len(queue)for i := 0; i < levelSize; i++ {cell := queue[0]queue = queue[1:]row, col := cell[0], cell[1]for _, dir := range directions {newRow := row + dir[0]newCol := col + dir[1]// 檢查邊界if newRow < 0 || newRow >= m || newCol < 0 || newCol >= n {continue}// 檢查是否可走且未訪問if maze[newRow][newCol] == '+' {continue}// 檢查是否是出口if isExit(newRow, newCol, entranceRow, entranceCol, m, n) {return steps + 1}// 標記為已訪問并入隊maze[newRow][newCol] = '+'queue = append(queue, []int{newRow, newCol})}}steps++}return -1
}func isExit(r, c, entranceR, entranceC, m, n int) bool {// 位于邊界且不是入口return (r == 0 || r == m-1 || c == 0 || c == n-1) && !(r == entranceR && c == entranceC)
}

二、算法分析

1. 核心思路
  • 廣度優先搜索(BFS):從入口出發分層擴展,首次到達邊界即最短路徑
  • 出口判定:當節點位于迷宮邊界且非入口時視為合法出口
  • 狀態管理:使用二維數組記錄訪問狀態,避免重復遍歷
2. 關鍵步驟
  1. 隊列初始化:將入口位置加入隊列,步數設為0
  2. 分層遍歷:每次處理一層節點,檢查是否符合出口條件
  3. 方向擴展:對合法相鄰節點(非墻、未訪問)進行入隊
  4. 終止條件:隊列為空時返回-1,表示無可行路徑
3. 復雜度
指標說明
時間復雜度O(mn)最壞情況遍歷所有節點
空間復雜度O(mn)維護訪問數組和隊列的空間消耗

三、圖解示例

在這里插入圖片描述

四、邊界條件與擴展

1. 特殊場景驗證
  • 入口即出口:入口在邊界但不算出口,需尋找其他邊界點
  • 全封閉迷宮:所有邊界點均為墻,返回-1
  • 螺旋路徑:需繞行多層后到達邊界出口
2. 擴展應用
  • 動態障礙物:支持實時更新墻的位置后重新計算路徑
  • 多出口優化:尋找所有出口中的最近/最遠距離
  • 三維迷宮:擴展為三維空間的路徑搜索問題
3. 其他語言
from collections import dequedef nearestExit(maze, entrance):m, n = len(maze), len(maze[0])directions = [(-1,0), (1,0), (0,-1), (0,1)]visited = [[False]*n for _ in range(m)]q = deque()# 初始化隊列和訪問狀態ent_r, ent_c = entranceq.append((ent_r, ent_c, 0))visited[ent_r][ent_c] = Truewhile q:r, c, steps = q.popleft()# 判斷當前節點是否為出口(邊界且非入口)if (r == 0 or r == m-1 or c == 0 or c == n-1) and (r, c) != (ent_r, ent_c):return steps# 遍歷四個方向for dr, dc in directions:nr, nc = r+dr, c+dcif 0 <= nr < m and 0 <= nc < n and not visited[nr][nc] and maze[nr][nc] == '.':visited[nr][nc] = Trueq.append((nr, nc, steps+1))return -1

五、總結與優化

1. 方法對比
方法優勢劣勢適用場景
BFS保證最短路徑空間消耗較大常規迷宮搜索
DFS空間效率高無法保證最短路徑路徑存在性驗證
A*算法啟發式搜索效率高需設計啟發函數大型迷宮優化搜索
2. 工程優化
  • 雙向BFS:從入口和出口同時搜索,減少搜索空間
  • 壓縮存儲:使用位運算壓縮訪問狀態數組
  • 并行計算:對多個方向進行并行路徑探索
3. 算法擴展
  • 權重迷宮:不同路徑消耗不同步數,尋找最小消耗路徑
  • 移動模式:支持對角線移動或限定轉向次數
  • 動態規劃:預處理各點到邊界的最短距離

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

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

相關文章

The Strict Teacher (Hard Version) 去除無效的干擾!巧妙轉化

文章目錄 The Strict Teacher (Hard Version) 思考問題&#xff01;那么多個人抓一個人&#xff0c;是否是每一個人都是對于最優策略的答案是有貢獻的&#xff1f;答案是否定的&#xff0c;其實問題可以簡化為三種情況&#xff1a; 所有的老師都在大衛的右邊&#xff0c;…

《 Reinforcement Learning for Education: Opportunities and Challenges》全文閱讀

Reinforcement Learning for Education: Opportunities and Challenges 面向教育的強化學習&#xff1a;機遇與挑戰 摘要 本綜述文章源自作者在 Educational Data Mining (EDM) 2021 會議期間組織的 RL4ED 研討會。我們組織了這一研討會&#xff0c;作為一項社區建設工作的組…

idea的快捷鍵使用以及相關設置

文章目錄 快捷鍵常用設置 快捷鍵 快捷鍵作用ctrlshift/注釋選中內容Ctrl /注釋一行/** Enter文檔注釋ALT SHIFT ↑, ALT SHIFT ↓上下移動當前代碼Ctrl ALT L格式化代碼Ctrl X刪除所在行并復制該行Ctrl D復制當前行數據到下一行main/psvm快速生成入口程序soutSystem.o…

代碼隨想錄算法訓練營Day30

力扣452.用最少數量的箭引爆氣球【medium】 力扣435.無重疊區間【medium】 力扣763.劃分字母區間【medium】 力扣56.合并區間【medium】 一、力扣452.用最少數量的箭引爆氣球【medium】 題目鏈接&#xff1a;力扣452.用最少數量的箭引爆氣球 視頻鏈接&#xff1a;代碼隨想錄 題…

Swift —— delegate 設計模式

一、什么是 delegate 模式 所謂 delegate 就是代理模式。簡單來說&#xff0c;delegate 模式就是在類的函數里運行完一段代碼后&#xff0c;你可以通過一個符合某個代理協議的屬性來調代理的方法。其中&#xff0c;代理方法就是回調函數。 二、delegate 模式與閉包比的優勢 …

linux-vi和文件操作

在 Linux 系統的世界里&#xff0c;有一個核心思想貫穿始終&#xff0c;那就是 “萬物都是文件”。這一理念極大地簡化了系統資源的管理和操作&#xff0c;為用戶和開發者提供了統一且高效的交互方式。本文將深入探討這一理念在 Linux 文件系統中的具體體現&#xff0c;從硬盤分…

Endnote 21顯示字段設置與修改詳細解析(附Endnote Click)

目錄 前言字段設置與詳細解釋Endnote Click1. 安裝 Endnote Click2. 一鍵獲取Edge插件3. 安裝完成啟動插件4. 檢索期刊文獻案例5. 在 Endnote Click 我的locker中導入文獻 前言 在學術研究的漫漫征途中&#xff0c;高效管理參考文獻是每位學者、學生都繞不開的關鍵環節。Endno…

java使用 ?Stream 流對自定義對象數組去重的

在 Java 中&#xff0c;使用 Stream 流對自定義對象數組去重的核心是確保對象能正確判斷“重復”的邏輯。以下是具體實現方法及場景分析&#xff1a; 方法 1&#xff1a;直接使用 distinct()&#xff08;需重寫 equals 和 hashCode&#xff09; 若自定義對象已正確重寫 equals…

C++ (類的設計,對象的創建,this指針,構造函數)

類的設計 C對結構體是有增強的 可以包含函數作為結構體成員 可以直接定義變量 在結構體成員函數里面可以直接訪問結構體成員變量 struct student{string name;int age;float score;void play_game(const string &name);}void student::play_game(const string game){}…

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文閱讀

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS: THE IMPACT OF PROBLEM-SOLVING DATA, DATA SYNTHESIS METHODS, AND TRAINING STAGES》全文閱讀 提升語言模型中的數學推理能力&#xff1a;問題求解數據、數據合成方法及訓練階段的影響 \begin{abstract} 數學推…

網絡測試工具:涵蓋網絡測速、密碼查看、故障判斷與網絡監測

在網絡管理與維護的廣闊領域中&#xff0c;網絡測試工具扮演著至關重要的角色。它們不僅簡化了復雜的網絡診斷流程&#xff0c;還提升了工作效率。今天推薦一款包含功能全面的網絡測試工具&#xff1a;InetTest&#xff0c;是一款免費且開源的網絡測試工具&#xff0c;適用于Wi…

小剛說C語言刷題——1005 - 已知一個圓的半徑,求解該圓的面積和周長

1.題目描述 已知一個圓的半徑&#xff0c;求解該圓的面積和周長。 輸入 輸入只有一行&#xff0c;只有 1個整數。 輸出 輸出只有兩行&#xff0c;一行面積&#xff0c;一行周長。&#xff08;保留兩位小數&#xff09;。 令 pi3.1415926。 樣例 輸入 1 輸出 3.14 6.…

【算法】快速排序

算法系列六&#xff1a;快速排序 一、快速排序的遞歸探尋 1.思路 2.書寫 3.搭建 3.1設計過掉不符情況&#xff08;在最底層時&#xff09; 3.2查驗能實現基礎結果&#xff08;在最底層往上點時&#xff09; 3.3跳轉結果繼續往上回搭 4.實質 二、快速排序里的基準排序 …

SoapUI 4.6.4(32位)下載安裝教程 - 兼容老舊Windows系統

SoapUI 4.6.4&#xff08;32位版&#xff09; 是個老版本的測試工具&#xff0c;專門給 32位 Windows 電腦 用的。現在最新版都是 64 位的了&#xff0c;但如果你還在用老系統&#xff0c;可能還得找這個舊版。 SoapUI 4.6.4工具下載:https://pan.quark.cn/s/c07381db8102 這…

【AI量化第24篇】KhQuant 策略框架深度解析:讓策略開發回歸本質——基于miniQMT的量化交易回測系統開發實記

我是Mr.看海&#xff0c;我在嘗試用信號處理的知識積累和思考方式做量化交易&#xff0c;應用深度學習和AI實現股票自動交易&#xff0c;目的是實現財務自由~ 目前我正在開發基于miniQMT的量化交易系統——看海量化交易系統。 本篇要講到量化的核心了——策略。說白了每個投資者…

Java面試黃金寶典48

1. C++ 的拷貝構造函數,深拷貝和淺拷貝 定義 拷貝構造函數:在 C++ 里,拷貝構造函數屬于特殊的構造函數,其功能是使用一個已存在的對象來初始化一個新對象。當對象以值傳遞的方式作為參數傳給函數、函數返回對象、用一個對象初始化另一個對象時,拷貝構造函數會被調用。淺拷…

OpenCV學習之獲取圖像所有點的坐標位置(二)

1.功能介紹 (1)使用openCV解析了.jpeg、.jpg、.png格式的圖像文件,輸出了圖像的寬、高、通道數; (2)創建txt格式文件,保存圖像中各像素點的rgba值。 2.環境介紹 操作系統:window10 開發語言:visual studio 2015 c++ 3.功能實現過程 3.1環境設置 (1)打開Vs2015…

B2B2C多用戶商城平臺 的兩種創新玩法

以前隨便搞個淘寶京東那樣的商城就能躺著賺錢的日子早過去了&#xff01;現在市面上各種電商玩法花樣百出&#xff1a;小紅書那種刷著刷著就下單的"種草"電商&#xff0c;拼多多那種"幫我砍一刀"的社交電商&#xff0c;還有抖音快手那種看著視頻突然就想買…

【Bluedroid】A2DP Sink播放流程源碼分析(二)

接上一篇繼續分析&#xff1a;【Bluedroid】A2DP Sink播放流程源碼分析(一)_安卓a2dp sink播放流程-CSDN博客 AVDTP接收端&#xff08;Sink&#xff09;流事件處理 bta_av_sink_data_cback 是 Bluedroid 中 A2DP Sink 角色的 AVDTP 數據回調函數&#xff0c;負責處理接收端的…

抗量子算法驗證工具

抗量子算法計算工具 抗量子算法驗證工具ML-KEMML-DSASLH-DSA 抗量子算法驗證工具 2024年末&#xff0c;美國NIST陸續公布了FIPS-203、FIPS-204、FIPS-205算法標準文檔&#xff0c;抽空學習了一下&#xff0c;做了個算法計算工具。 ML-KEM ML-DSA SLH-DSA 需要的朋友可留言交流…