BFS:多源BFS問題

一、多源BFS簡介

?超級源點:其實就是把相應的原點一次性都丟到隊列中

二、01矩陣

. - 力扣(LeetCode)

class Solution {
public:const int dx[4]={1,-1,0,0};const int dy[4]={0,0,1,-1};vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {//多源BFS  正難則反,以0為起點向外擴展int m=mat.size(),n=mat[0].size();vector<vector<int>> dis(m,vector<int>(n,-1));//要輸出的數組 -1表示沒有搜索過queue<pair<int,int>> q;//存儲起點for(int i=0;i<m;++i)for(int j=0;j<n;++j)if(mat[i][j]==0){q.emplace(i,j);dis[i][j]=0;}//不需要標記數組 不需要step 也不需要控制一層一層出sz//因為dis數組不僅可以標記哪些地方沒有搜索過或者搜索過,而且存儲了最短距離while(!q.empty()){auto[a,b]=q.front();q.pop();for(int k=0;k<4;++k){int x=dx[k]+a,y=dy[k]+b;if(x>=0&&x<m&&y>=0&&y<n&&dis[x][y]==-1) {dis[x][y]=dis[a][b]+1;q.emplace(x,y);}}}return dis;}
};

三、飛地的數量

. - 力扣(LeetCode)

class Solution {
public:
//正難則反const int dx[4]={1,-1,0,0};const int dy[4]={0,0,1,-1};int numEnclaves(vector<vector<int>>& grid) {int m=grid.size(),n=grid[0].size();//從邊開始進行一次寬搜 將可以走出邊界的標記一下vector<vector<bool>> vis(m,vector<bool>(n));//將邊界1的都丟到隊列中queue<pair<int,int>> q;for(int i=0;i<m;++i)//第一行和最后一行for(int j=0;j<n;++j)if(i==0||i==m-1||j==0||j==n-1)if(grid[i][j]==1){q.emplace(i,j);vis[i][j]=true;}//進行多源BFSwhile(!q.empty()){auto [a,b]=q.front();q.pop();for(int k=0;k<4;++k){int x=dx[k]+a,y=dy[k]+b;if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&vis[x][y]==false){q.emplace(x,y);vis[x][y]=true;}}}//處理完之后,遍歷一下找到沒有被標記且為1的單元格 就可以統計個數了int ret=0;for(int i=0;i<m;++i)for(int j=0;j<n;++j)if(grid[i][j]==1&&vis[i][j]==false) ++ret;return ret;}
};

四、地球中的最高點

. - 力扣(LeetCode)

class Solution {
public:const int dx[4]={1,-1,0,0};const int dy[4]={0,0,1,-1};vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {int m=isWater.size(),n=isWater[0].size();vector<vector<int>> vv(m,vector<int>(n,-1));//正難則反queue<pair<int,int>> q;for(int i=0;i<m;++i)for(int j=0;j<n;++j)if(isWater[i][j]==1){q.emplace(i,j);vv[i][j]=0;}//多源BFSwhile(!q.empty()){auto[a,b]=q.front();q.pop();for(int k=0;k<4;++k){int x=dx[k]+a,y=dy[k]+b;if(x>=0&&x<m&&y>=0&&y<n&&vv[x][y]==-1){vv[x][y]=vv[a][b]+1;q.emplace(x,y);}}}return vv;}
};

?五、地圖分析

. - 力扣(LeetCode)

class Solution {
public:const int dx[4]={1,-1,0,0};const int dy[4]={0,0,1,-1};int maxDistance(vector<vector<int>>& grid) {int m=grid.size(),n=grid[0].size();vector<vector<int>> vv(m,vector<int>(n,-1));queue<pair<int,int>> q;for(int i=0;i<m;++i) for(int j=0;j<n;++j)if(grid[i][j]==1){q.emplace(i,j);vv[i][j]=0;}//多源BFSint ret=-1;//如果只有海洋或者只有陸地,那么就會直接返回-1while(!q.empty()){auto[a,b]=q.front();q.pop();for(int k=0;k<4;++k){int x=dx[k]+a,y=dy[k]+b;if(x>=0&&x<m&&y>=0&&y<n&&vv[x][y]==-1){vv[x][y]=vv[a][b]+1;q.emplace(x,y);ret=max(ret,vv[x][y]);}}}return ret;}
};

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

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

相關文章

Makefile--自動識別編譯環境(x86還是arm)進行編譯

在日常工作中&#xff0c;我們會在虛擬機下的x86系統進行架叉編譯&#xff0c;有時需要在arm上直接進行編譯。但工程都是一樣的&#xff0c;只是Makefile不一樣&#xff0c;這時就涉及到Makefile的靈活運用了。以下是一個自動識別編譯環境的通用Makefile&#xff1a; TARGET_A…

headerpwn:一款針對服務器響應與HTTP Header的模糊測試工具

關于headerpwn headerpwn是一款針對服務器響應與HTTP Header的模糊測試工具&#xff0c;廣大研究人員可以利用該工具查找網絡異常并分析服務器是如何響應不同HTTP Header的。 功能介紹 當前版本的headerpwn支持下列功能&#xff1a; 1、服務器安全與異常檢測&#xff1b; 2、…

PyTorch 1-深度學習

深度學習-PyTorch 一: Pytorch1> pytorch簡介2> PyTorch 特點&優勢3> pytorch簡史4> pytorch 庫5> PyTorch執行流程6> PyTorch 層次結構二: PyTorch常用的高級API和函數1> 自動求導(Autograd)2> 模型容器(Module)3> 優化器(Optimizer)4&g…

Java Stream API詳解:高效處理集合數據的利器

引言 Java 8引入了許多新特性&#xff0c;其中最為顯著的莫過于Lambda表達式和Stream API。Stream API提供了一種高效、簡潔的方法來處理集合數據&#xff0c;使代碼更加簡潔明了&#xff0c;且具有較高的可讀性和可維護性。本文將深入探討Java Stream API的使用&#xff0c;包…

QFileDialog的簡單了解

ps&#xff1a;寫了點垃圾&#xff08;哈哈哈&#xff09; 它繼承自QDialog 這是Windows自己的文件夾 這是兩者的對比圖&#xff1a; 通過看QFileDialog的源碼&#xff0c;來分析它是怎么實現這樣的效果的。 源碼組成&#xff1a; qfiledialog.h qfiledialog_p.h&#xff…

Python面試寶典第11題:最長連續序列

題目 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1&#xff1a; 輸入&#xff1a;nums [100,4,200,1,3,2] 輸出&#xff1a;…

微信小程序中的數據通信

方法1: 使用回調函數 在app.js中:可以在修改globalData后執行一個回調函數,這個回調函數可以是頁面傳遞給app的一個更新函數。// app.js App({globalData: {someData: ,},setSomeData(newData, callback) {this.globalData.someData = newData;if (typeof callback === funct…

打造熱銷爆款:LazadaShopee店鋪測評與關鍵詞策略

面對Lazada和Shopee平臺上店鋪銷量難以突破的困境&#xff0c;賣家們往往尋求各種解決方案。其中&#xff0c;店鋪測評作為提升店鋪信譽、優化產品排名及增加曝光度的有效手段&#xff0c;正逐漸成為賣家關注的焦點。以下將深入探討店鋪測評的好處、實施技巧及自養號的關鍵要素…

提升校園效率:智慧校園后勤管理中的尋物管理功能

在智慧校園后勤管理體系中&#xff0c;尋物管理功能扮演著連接遺失與找回的橋梁角色&#xff0c;它充分利用現代信息技術&#xff0c;為校園內的師生提供了一套高效、便捷的失物招領解決方案。此功能圍繞以下幾個核心方面展開。 首先&#xff0c;它支持在線報失與信息登記。一旦…

如何連接到公司的服務器?

1.下載FileZilla FileZilla的下載與安裝以及簡單使用&#xff08;有圖解超簡單&#xff09;-CSDN博客 2.打開 3.輸入主機 用戶名 密碼 端口 注&#xff1a;主機支持的協議類型&#xff1a; 4.連接成功 其他方式也有很多&#xff0c;比如通過cmd&#xff0c;html網頁等等 3個…

昇思25天學習打卡營第19天|ShuffleNet圖像分類

今天是參加昇思25天學習打卡營的第19天&#xff0c;今天打卡的課程是“ShuffleNet圖像分類”&#xff0c;這里做一個簡單的分享。 1.簡介 在第15-18日的學習內容中&#xff0c;我們陸陸續續學習了計算機視覺相關的模型包括圖像語義分割、圖像分類、目標檢測等內容&#xff0c…

面試遲到了怎么辦

嗨&#xff0c;我是蘭若姐姐。作為一名面試官&#xff0c;最近面試了很多的測試候選人&#xff0c;有了很多感慨&#xff0c;借此抒發一下&#xff0c;我不知道別人面試更看重的是什么&#xff0c;但是在我這里&#xff0c;我最看重的是態度&#xff0c;其次才是技能 我覺得作…

vivado EXTRACT_ENABLE、EXTRACT_RESET

可提取 EXTRACT_ENABLE控制寄存器推斷是否啟用。通常&#xff0c;Vivado工具 提取或不提取基于啟發式方法&#xff0c;通常有利于最大程度的 設計。如果Vivado的行為不符合預期&#xff0c;此屬性將覆蓋 工具的默認行為。如果有不希望的啟用連接到CE引腳 觸發器&#xff0c;此屬…

中關村軟件園發布“數據合規與出境評估服務平臺”

在2024中關村論壇年會期間&#xff0c;中關村軟件園發布“數據合規與出境評估服務平臺”。該平臺是中關村軟件園結合北京市“兩區”建設&#xff0c;立足軟件園國家數字服務出口基地和數字貿易港建設&#xff0c;圍繞園區內外部企業用戶的業務合作、科研創新、跨國運營等場景需…

Python UDP編程之實時聊天與網絡監控詳解

概要 UDP(User Datagram Protocol,用戶數據報協議)是網絡協議中的一種,主要用于快速、簡單的通信場景。與TCP相比,UDP沒有連接、確認、重傳等機制,因此傳輸效率高,但也不保證數據的可靠性和順序。本文將詳細介紹Python中如何使用UDP協議進行網絡通信,并包含相應的示例…

七天.NET 8操作SQLite入門到實戰 - 第一天 SQLite 簡介

什么是SQLite&#xff1f; SQLite是一個輕量級的嵌入式關系型數據庫&#xff0c;它以一個小型的C語言庫的形式存在。它的設計目標是嵌入式的&#xff0c;而且已經在很多嵌入式產品中使用了它&#xff0c;它占用資源非常的低&#xff0c;在嵌入式設備中&#xff0c;可能只需要幾…

Vscode插件推薦——智能切換輸入法(Smart IME)

前言 相信廣大程序員朋友在寫代碼的時候一定會遇到過一個令人非常頭疼的事情——切換輸入法&#xff0c;特別是對于那些勤于寫注釋的朋友&#xff0c;簡直就是噩夢&#xff0c;正所謂懶人推動世界發展&#xff0c;這不&#xff0c;今天就向大家推薦一款好用的vscode插件&#…

ES6 Class(類) 總結(九)

ES6 中的 class 是一種面向對象編程的語法糖&#xff0c;提供了一種簡潔的方式來定義對象的結構和行為。 JavaScript 語言中&#xff0c;生成實例對象的傳統方法是通過構造函數。下面是一個例子。 function Point(x, y) {this.x x;this.y y; } Point.prototype.toString fu…

使用定時器消除抖動

問題&#xff1a;定時器中斷和按鍵中斷屬于什么操作模式&#xff0c;輪詢嗎&#xff1f; 具體怎么實現 定時器中斷 &#xff08;判斷&#xff09; 時間參數 按鍵中斷&#xff08;修改&#xff09; 中斷 向量表.s文件 DCD SysTick_Handler …

如何理解跨界營銷?詳解跨界營銷的主要類型和方法!

跨界營銷是一種創新的營銷策略&#xff0c;它巧妙地捕捉不同行業、產品和消費者偏好之間的共通點和潛在聯系。這種策略將看似不相關的元素相互融合&#xff0c;相互影響&#xff0c;創造出一種全新的生活方式和審美觀念&#xff0c;以此吸引目標消費者群體的注意和青睞。 通過…