走迷宮(BFS寬度優先搜索)

給定一個?n×m 的二維整數數組,用來表示一個迷宮,數組中只包含?0?或?1,其中?0?表示可以走的路,1?表示不可通過的墻壁。

最初,有一個人位于左上角?(1,1)處,已知該人每次可以向上、下、左、右任意一個方向移動一個位置。

請問,該人從左上角移動至右下角?(n,m) 處,至少需要移動多少次。

數據保證?(1,1) 處和?(n,m) 處的數字為?0,且一定至少存在一條通路。

輸入格式

第一行包含兩個整數?n?和?m。

接下來?n?行,每行包含?m?個整數(00?或?11),表示完整的二維數組迷宮。

輸出格式

輸出一個整數,表示從左上角移動至右下角的最少移動次數。

數據范圍

1≤n,m≤100

輸入樣例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
輸出樣例:
8

思路:從起始點出發,每次找它旁邊的能走的點(上下左右四個方向),然后再從新找到的點找旁邊能走的點,依次類推,直到找到終點為止,這里我們用一個隊列去實現,先將起點入隊,然后當隊列不為空的時候,每次取出隊頭的點,找出隊頭旁邊的點,將旁邊能走的點(且第一次找到)入隊,這樣就能一直找找到終點。

BFS就是把這一層全部搜完才會搜下一層,因此它第一次搜到的點就是該點離起始點最近的時候,適合用來解決求最小步數,最少操作幾次等最短路問題。

?找的順序如下圖所示

可以看到在圖上的例子里面,我們找了八次找到了終點,也就是終點到起點的距離為8。

如何實現找出隊頭旁邊的點:

    int dx[4]={-1,1,0,0}, dy[4]={0,0,-1,1};  //用向量表示點走四個方向后的變化,分別是上下左右while(q.size()){PII t=q.front();  //得到隊頭q.pop();  //刪掉隊頭,和上面的代碼加起來就是取出隊頭for(int i=0;i<4;i++) //隊頭的點依次走四個方向{int x=t.first+dx[i];int y=t.second+dy[i];//點在邊界內且點可以走且點是第一次被找到if(x>=0 && x<n && y>=0 && y<m && g[x][y]==0 && d[x][y]==-1){d[x][y]=d[t.first][t.second]+1;  //每次找的是它的上下左右的點,且不會找已經走過的點,所以找到的點離起點的距離就又遠了1q.push({x,y});   //把這個新找到的點放進隊伍中}}}

用dx和dy數組表示上下左右四個方向移動后點坐標的變化,這里的坐標(x,y)表示的是x行y列,向上就是x-1,y不變,我們把它放進dx和dy的第一個元素里,寫為-1和0?

 int dx[4]={-1,1,0,0}, dy[4]={0,0,-1,1};  //用向量表示點走四個方向后的變化,分別是上下左右

四個方向的變化如下圖所示:?

示例代碼:?

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;typedef pair<int,int> PII; //這個主要是方便隊列存放點的坐標,所以需要一對int
const int N =100; 
int n,m;
int g[N][N]; //存儲地圖
int d[N][N]; //存儲每一個點到起點的距離int bfs()
{queue<PII> q;memset(d,-1,sizeof(d));  //初始全部設為-1,表示全沒走過d[0][0]=0;  //起始點到起點的距離為0q.push({0,0}); //第一個點入隊int dx[4]={-1,1,0,0}, dy[4]={0,0,-1,1};  //用向量表示點走四個方向后的變化,分別是上下左右while(q.size()){PII t=q.front();  //得到隊頭q.pop();  //刪掉隊頭,和上面的代碼加起來就是取出隊頭for(int i=0;i<4;i++) //隊頭的點依次走四個方向{int x=t.first+dx[i];int y=t.second+dy[i];//沿著這個方向走,點在邊界內,并且這個點可以走(g[x][y]==0),這個點還沒有走過(d[x][y]==-1,第一次搜到的點才是最短距離)if(x>=0 && x<n && y>=0 && y<m && g[x][y]==0 && d[x][y]==-1){d[x][y]=d[t.first][t.second]+1;  //每次找的是它的上下左右的點,且不會找已經走過的點,所以找到的點離起點的距離就又遠了1q.push({x,y});   //把這個新找到的點放進隊伍中}}}return d[n-1][m-1];  //輸出到右下角的點(終點)的最短距離
}
int main()
{cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>g[i][j];}}cout<<bfs()<<endl;return 0;
}

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

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

相關文章

MySQL數據庫約束你真的懂嗎?

??????今天給各位帶來的是關于數據庫約束方面的知識 清風的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能對你有所幫助&#xff0c;有不足的地方還請各位看官多多指教&#xff0c;大家一起學習交流&#xff01; 動動你們發財的小手&#xff0c;點點關…

JMeter接口測試之文件上傳

最近用JMeter做接口測試&#xff0c;頻繁遇到了文件上傳的接口&#xff0c;與其他一般接口的處理方式不一樣&#xff0c;想著分享下&#xff0c;希望能給測試同學一點啟發。 文章將圍繞三個部分進行展開&#xff1a; 一、用戶場景 二、接口請求參數 三、JMeter腳本編寫步驟…

C語言每日一題(36)隊列實現棧功能

力扣 225 用隊列實現棧 題目描述 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&#xff09;。 實現 MyStack 類&#xff1a; void push(int x) 將元素 x 壓入棧頂。int…

vue2系列 — 自定義指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定義指令的鉤子 bind&#xff1a; 當 v-XXX 指令綁定到節點上時 觸發inserted&#xff1a;被綁定元素插入父節點時調用update&#xff1a;所在組件的 VNode 更新…

使用nprogress實現請求進度條

一、安裝nprogress npm i nprogress 二、 在axios的請求攔截器中使用nprogress 如果對于axios的請求和響應攔截器的使用不了解的&#xff0c;可以看這篇文章&#xff1a; axios二次封裝配置請求攔截器和響應攔截器-CSDN博客 nprogress上有兩個有用的方法&#xff1a; star(…

OpenStack云計算平臺-Dashboard(圖形化)

目錄 一、安裝和配置 1、安全并配置組件 2、完成安裝 ?二、驗證操作 一、安裝和配置 1、安全并配置組件 安裝軟件包&#xff1a; yum install openstack-dashboard 編輯文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

如何用Python爬取全國高校數據?

前言 Python是一門強大的編程語言&#xff0c;它可以用于爬取互聯網上的各種數據。在這篇文章中&#xff0c;我們將學習如何使用Python爬取全國高校數據&#xff0c;并使用代理IP進行爬取。 本文主要分為以下幾個部分&#xff1a; 數據來源及需求安裝依賴包及導入模塊爬取全…

關于禪道的安裝配置以及項目管理、團隊協同工作

目錄 一、禪道是什么&#xff1f; 二、特點和功能 三、安裝禪道 3.1 下載官網 3.2 版本考慮 3.3 禪道使用手冊參考 3.4 Windows端安裝禪道 四、啟動禪道 4.1 訪問禪道 四、禪道部分功能的使用 4.1 添加項目集 4.2 啟動/關閉項目 4.3 項目計劃儀表盤/階段目標/研發…

頭歌——操作系統實訓總結

死鎖 1、系統出現死鎖時一定同時保持了四個必要條件&#xff0c;對資源采用按序分配算法后可破壞的條件是&#xff08;A&#xff09;。 A、循環等待條件B、互斥條件C、占有并等待條件D、不可搶占條件 2、資源的靜態分配算法在解決死鎖問題中是用于&#xff08;B&#xff09;。 …

【圖論】關鍵路徑求法c++

代碼結構如下圖&#xff1a; 其中topologicalSort(float**, int, int*, bool*, int, int)用來遞歸求解拓撲排序&#xff0c;topologicalSort(float**, int*&, int, int, int)傳參圖的鄰接矩陣mat與結點個數n&#xff0c;與一個引用變量數組topo&#xff0c;返回一個布爾值…

代碼隨想錄-刷題第五天

鏈表題目總結 鏈表基本操作 對鏈表進行增刪改查等基本操作。注意&#xff0c;很多鏈表的題目使用虛擬頭結點操作起來會更加方便。每次對應頭結點的情況都要單獨處理&#xff0c;所以使用虛擬頭結點的技巧&#xff0c;就可以解決這個問題。 反轉鏈表 可以使用頭插法&#xf…

Shopee本土號封號幾率大嗎?如何避免封號?被封號了怎么辦?

Shopee是近幾年熱門的電商平臺之一&#xff0c;即使越來越多的跨境電商涌現&#xff0c;他的地位在東南亞市場依然占據一席之地&#xff0c;也依舊吸引著需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被關停之后&#xff0c;留下了大片空白&#xff0c;Shope…

CF 1890A Doremy‘s Paint 3 學習筆記 map的使用

原題 A. Doremys Paint 3 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output An array &#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45b;&#xfffd;1,&#xfffd;2,…,&#xfffd;&a…

跨境電商必須要海外代理IP嗎?盤點五大海外代理IP

相信跨境電商人近日都為了2023的跨境黑五旺季奮戰&#xff0c;而2024也即將來臨&#xff0c;對于跨境人的考驗一波接著一波&#xff0c;根據Adobe Analytics的數據&#xff0c;2022年黑色星期五的銷售額創下91.2億美元新高&#xff0c;網絡星期的銷售額同樣達到創紀錄的113億美…

『 C++類與對象 』多態之單繼承與多繼承的虛函數表

文章目錄 &#x1fae7; 前言&#x1fae7; 查看虛表&#x1fae7; 單繼承下的虛函數表&#x1fae7; 多繼承下的虛函數表 &#x1fae7; 前言 多態是一種基于繼承關系的語法,既然涉及到繼承,而繼承的方式有多種: 單繼承多繼承棱形繼承棱形虛擬繼承 不同的繼承方式其虛表的形…

ToDesk提示通道限制 - 解決方案

問題 使用ToDesk進行遠程控制時&#xff0c;免費個人賬號最多支持1個設備同時發起遠控&#xff0c;若使用此賬號同時在2個設備發起遠控&#xff0c;則會提示通道限制&#xff0c;如下圖&#xff1a; 解決方案 方案1&#xff1a;斷開其它遠控 出現通道限制彈窗時&#xff0…

數據結構(超詳細講解!!)第二十四節 二叉樹(下)

1.遍歷二叉樹 在二叉樹的一些應用中&#xff0c;常常要求在樹中查找具有某種特征的結點&#xff0c;或者對樹中全部結點逐一進行某種處理。這就引入了遍歷二叉樹的問題&#xff0c;即如何按某條搜索路徑訪問樹中的每一個結點&#xff0c;使得每一個結點僅且僅被訪問一次。 …

python3實現tailf命令

由于windows上面沒有類似linux上面的tailf命令&#xff0c;所以下面的python腳本來代替其能力。 tailf.py import re import timeimport os import argparsedef follow(thefile):thefile.seek(0, os.SEEK_END)while True:_line thefile.readline()if not _line:time.sleep(0…

RabbitMQ 搭建和工作模式

MQ基本概念 1. MQ概述 MQ全稱 Message Queue&#xff08;[kju?]&#xff09;&#xff08;消息隊列&#xff09;&#xff0c;是在消息的傳輸過程中保存消息的容器。多用于分布式系統之間進行通信。 &#xff08;隊列是一種容器&#xff0c;用于存放數據的都是容器&#xff0…