代碼隨想錄|圖論|04廣度優先搜索理論基礎

廣搜的使用場景

廣搜的搜索方式就適合于解決兩個點之間的最短路徑問題。

因為廣搜是從起點出發,以起始點為中心一圈一圈進行搜索,一旦遇到終點,記錄之前走過的節點就是一條最短路。

當然,也有一些問題是廣搜 和 深搜都可以解決的,例如島嶼問題,這類問題的特征就是不涉及具體的遍歷方式,只要能把相鄰且相同屬性的節點標記上就行。 (我們會在具體題目講解中詳細來說)

比如下面這個圖,從start開始慢慢向外擴展,第4次擴展才到end,那么最短路徑的長度就是4,

一旦遇到終止點,那么一定是一條最短路徑。

BFS模板

針對這個圖,有下面的BFS模塊,目的是遍歷整個二維網格,并且記錄哪些位置已經被訪問過。

/*
廣度優先搜索的模板,也就是bfs函數。
*/#include <iostream>
#include <queue>
#include <vector>
using namespace std;// 定義四個可能的移動方向
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
/*** 使用廣度優先搜索(BFS)遍歷二維網格* @param grid 二維網格,通常表示為二維數組* @param visited 記錄網格中各位置是否已被訪問過的二維布爾數組* @param x 起始位置的x坐標* @param y 起始位置的y坐標* 此函數的目的是通過BFS算法遍歷網格中所有連接的位置*/
void bfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int x, int y)
{// 使用隊列來實現BFS算法queue<pair<int, int>> que;// 將起始位置(x, y)加入隊列,并標記為已訪問que.push({x, y});visited[x][y] = true;// 當隊列不為空時,循環繼續while (!que.empty()){// 獲取隊列頭部的位置pair<int, int> cur = que.front();que.pop();int curx = cur.first;int cury = cur.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.size() || nexty < 0 || nexty >= grid[0].size())continue;// 如果下一個位置未被訪問過,則加入隊列并標記為已訪問if (!visited[nextx][nexty]){que.push({nextx, nexty});visited[nextx][nexty] = true;}}}
}

算法從起始位置 (x, y) 開始,探索四個相鄰的方向,并訪問所有與起始位置連通的區域。使用隊列來管理待訪問的位置,并且使用 visited 數組來防止重復訪問。

BFS的應用問題

  • 迷宮問題:BFS 可以用于尋找迷宮的最短路徑,或者探索從起始點出發,能到達的所有位置。

  • 圖的遍歷:BFS 廣泛應用于圖的遍歷中,特別是無權圖中尋找最短路徑時。

  • 搜索問題:可以在很多搜索問題中使用 BFS,如路徑規劃、連通區域的計算等。

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

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

相關文章

Xposed框架深度解析:Android系統級Hook實戰指南

引言:Android系統定制化的革命性突破 在移動安全研究和系統優化領域,傳統的APP修改方案面臨??三重技術瓶頸??: ??逆向工程壁壘??:APK重打包方案需處理簽名校驗、代碼混淆等防護,平均耗時增加200%??兼容性挑戰??:Android碎片化導致設備適配率不足65%??功能…

大模型在通訊網絡中的系統性應用架構

一、網絡架構智能化重構?? ??1.1 空天地一體化組網優化?? 智能拓撲動態調整??&#xff1a;大模型通過分析衛星軌道數據、地面基站負載及用戶分布&#xff0c;實時優化天地一體化網絡拓撲。例如&#xff0c;在用戶密集區域&#xff08;如城市中心&#xff09;自動增強低…

軟件測試進階:Python 高級特性與數據庫優化(第二階段 Day6)

在掌握 SQL 復雜查詢和 Python 數據庫基礎操作后&#xff0c;第六天將深入探索Python 高級編程特性與數據庫性能優化。通過掌握 Python 的模塊與包管理、裝飾器等高級語法&#xff0c;結合數據庫索引優化、慢查詢分析等技術&#xff0c;提升測試工具開發與數據處理效率。 一、…

【NLP】自然語言項目設計04

目錄 04模型驗證 代碼架構核心設計說明 05運行推理 代碼架構核心設計說明 項目展望 項目簡介 訓練一個模型&#xff0c;實現歌詞仿寫生成 任務類型&#xff1a;文本生成&#xff1b; 數據集是一份歌詞語料&#xff0c;訓練一個模型仿寫歌詞。 要求 1.清洗數據。歌詞語料…

數據結構1 ——數據結構的基本概念+一點點算法

數據結構算法程序設計 什么是數據結構 數據&#xff08;data&#xff09;&#xff1a;符號集合&#xff0c;處理對象。 數據元素&#xff08;data element&#xff09;&#xff0c;由數據項&#xff08;data item&#xff09; 組成。 關鍵字&#xff08;key&#xff09;識別…

每日八股文7.1

每日八股-7.1 網絡1.能說說 TCP 報文頭部都包含哪些關鍵字段嗎&#xff1f;2.TCP 是如何確保數據傳輸的可靠性的&#xff1f;你能詳細談談嗎&#xff1f;3.你能解釋一下 TCP 滑動窗口是如何設計的&#xff1f;它主要解決了什么問題&#xff1f;4.TCP 協議的擁塞控制是如何實現的…

高性能 List 轉 Map 解決方案(10,000 元素)

文章目錄 前言一、問題背景&#xff1a;為什么List轉Map如此重要&#xff1f;二、基礎方法對比&#xff1a;Stream vs For循環三、性能優化關鍵點四、面試回答技巧 前言 遇到一個有意思的面試題&#xff0c;如標題所說&#xff0c;當10,000條數據的List需要轉Map&#xff0c;如…

今日行情明日機會——20250701

上證指數縮量收陽線&#xff0c;形成日線上漲中繼&#xff0c;個股上漲和下跌總體持平。 深證指數量能持續放大&#xff0c;即將回補缺口位&#xff0c;短線注意周三或周四的調整。 2025年7月1日漲停股主要行業方向分析 1. 芯片&#xff08;17家漲停&#xff0c;國產替代&…

P1312 [NOIP 2011 提高組] Mayan 游戲

題目描述 Mayan puzzle 是最近流行起來的一個游戲。游戲界面是一個 7 7 7 行 5 \times5 5 列的棋盤&#xff0c;上面堆放著一些方塊&#xff0c;方塊不能懸空堆放&#xff0c;即方塊必須放在最下面一行&#xff0c;或者放在其他方塊之上。游戲通關是指在規定的步數內消除所有…

Spring Boot 2 多模塊項目中配置文件的加載順序

Spring Boot 2 多模塊項目中配置文件的加載順序 在 Spring Boot 2 多模塊項目中&#xff0c;配置文件的加載遵循特定的順序規則。了解這些規則對于正確管理多模塊應用的配置至關重要。 一、默認配置文件加載順序 Spring Boot 會按照以下順序加載 application.properties 或 …

邊界的藝術:支持向量機與統計學習時代的王者

當揚勒丘恩的卷積神經網絡LeNet在90年代初于手寫數字識別領域綻放光芒&#xff0c;卻因計算與數據的桎梏未能點燃更廣泛的燎原之火時&#xff0c;人工智能&#xff0c;特別是其子領域機器學習&#xff0c;正步入一個理論深化與方法論多元化的關鍵時期。經歷了符號主義通用智能探…

js filter()

listType(queryParams.value).then(response > {filterTable.value response.rows.slice(1); // 只顯示前3條數據;filterTable.value filterTable.value.filter(item > {return wnSensorsList.value.some(sensorsgroup > {return sensorsgroup.sensorType item.cod…

Python 庫 包 nltk (Natural Language Toolkit)

文章目錄 &#x1f9f0; 一、nltk 的主要功能? 文本處理功能? 內置語料庫&#xff08;Corpora&#xff09; &#x1f4e6; 二、安裝與使用1. 安裝 nltk2. 下載語料庫&#xff08;第一次使用時需要下載&#xff09; &#x1f50d; 三、常用功能示例示例 1&#xff1a;分詞示例…

設計模式之房產中介——代理模式

手撕設計模式之房產中介——代理模式 1.業務需求 ? 大家好&#xff0c;我是菠菜啊&#xff0c;好久不見&#xff0c;今天給大家帶來的是——代理模式。老規矩&#xff0c;在介紹這期內容前&#xff0c;我們先來看看這樣的需求&#xff1a;我們有一套房產需要出售&#xff0c…

Unity進階課程【六】Android、ios、Pad 終端設備打包局域網IP調試、USB調試、性能檢測、控制臺打印日志等、C#

Unity打包 Android、ios、Pad 終端設備局域網IP調試、USB調試 今天咱們繼續進階課程&#xff0c;定期更新&#xff0c;有想學習的不懂的地方也可以告訴我。 提示&#xff1a;內容純個人編寫&#xff0c;歡迎評論點贊&#xff0c;來指正我。 文章目錄 Unity打包 Android、ios、P…

c++中的mutex同步機制與多線程同步實現

C 中的 std::mutex 與多線程同步 在多線程編程中&#xff0c;互斥鎖&#xff08;Mutex&#xff09; 是一種同步機制&#xff0c;用于保護共享資源&#xff08;如變量、數據結構&#xff09;免受數據競爭&#xff08;Data Race&#xff09;的影響。C 標準庫中的 std::mutex 提供…

網絡安全2023—新安全新發展

關于綠盟科技 綠盟科技集團股份有限公司(以下簡稱綠盟科技),成立于 2000 年 4 月,總部位于北京。公司于 2014 年 1 月 29 日在深圳證券交易所創業板上市,證券代碼:300369。綠盟科技在國內設有 50余個分支機構,為政府、金融、運營商、能源、交通、科教文衛等行業用戶與各…

WebSocket掃盲

WebSocket 是一種網絡通信協議&#xff0c;它允許在單個 TCP 連接上進行全雙工、雙向的實時通信。它是為了解決傳統 HTTP 協議在實時交互應用中的局限性而設計的。 核心概念和特點 解決 HTTP 的痛點&#xff1a; 單向性&#xff1a; HTTP 是請求-響應模式。客戶端發起請求&…

Springboot整合高德地圖

1.登錄高德開放平臺 高德開放平臺 | 高德地圖API 2.獲取密鑰key 1.點擊控制臺 2.創建新應用 3.添加key 4.創建key 5.獲取key 3.java整合 1.高德配置類 package com.thk.controller.map;import org.springframework.beans.factory.annotation.Value; import org.springfram…

【SQL知識】PDO 和 MySQLi 的區別

目錄 簡介 主要區別 預處理語句示例比較 PDO 示例 MySQLi 示例 選擇建議 簡介 PDO (PHP Data Objects) 和 MySQLi (MySQL Improved) 都是 PHP 中用于數據庫操作的擴展&#xff0c;都支持預處理語句&#xff0c;但有一些重要區別&#xff1a; 主要區別 數據庫支持 PDO&am…