續集 廣度優先搜尋

2021-10-02 09:10:40 字數 2234 閱讀 8684

直接把上次那個題拿來充個數:

題目背景

給定乙個n*m方格的迷宮,迷宮裡有t處障礙,障礙處不可通過。給定起點座標和終點座標,問: 每個方格最多經過1次,有多少種從起點座標到終點座標的方案。在迷宮中移動有上下左右四種方式,每次只能移動乙個方格。資料保證起點上沒有障礙。

輸入格式

第一行n、m和t,n為行,m為列,t為障礙總數。第二行起點座標sx,sy,終點座標fx,fy。接下來t行,每行為障礙點的座標。

輸出格式

給定起點座標和終點座標,問每個方格最多經過1次,從起點座標到終點座標最短步數

給乙個簡單的資料我們先來分析一下

4 4 3

1 1 4 4

2 23 2

3 3好像不是很直觀哈哈,給整個圖,就這個亞子叭:

再給整個編號

我們先規定,到每個新節點,按右,下,上,左的順序嘗試;那麼我們一步一步分析;

先放個流程圖,哈哈哈

要完成上面的步驟,我們可以這樣:

每一步都嘗試能走的所有方向,能走通就往下走

走過的結點不再走

只要有一種方式到終點就輸出步數

然後我們會發現,和深搜不通的是,廣搜走著走著某一步會有很多很多個節點都可以繼續往下走,為了儲存上一步的節點(們),我們用乙個佇列來模擬

具體呢就是讓頭指向上一步的第乙個乙個節點,然後每處理乙個節點就讓head++;這樣就實現了在進入下一步前,處理的每乙個方向都是這一步的,因為廣搜本來就是用來找最短路徑,所以這樣做可以實現

舉個例子:

== 藍色的是top,橘色的是tail==

看圖,,,前兩張新增了由第一步第乙個節點新產生的兩個節點,

然後第一步第二個節點新產生的兩個節點

此時當top繼續後移就進入下一步繼續上面的步驟

可以發現,某一步所走的所有節點都在一起,這就是廣搜的效果了

介紹到這裡就結束了,其實廣搜也可以當作模擬來看,上面的步驟已經給了,下面放**

#include

struct node

list[

10000];

//用乙個佇列來模擬

intmain()

,book[

100]

[100]=

,n,m;

int ex,ey;

int flag=0;

int top=

0,tail=0;

int next[4]

[2],

,,};

scanf

("%d%d%d"

,&n,

&m,&sd)

;scanf

("%d%d"

,&sx,

&sy)

;scanf

("%d%d"

,&ex,

&ey)

;for

(i=0

;i) book[sx]

[sy]=1

;//插入第乙個節點

list[tail]

.x=sx;

list[tail]

.y=sy;

list[tail]

.bs=0;

tail++

; cc=0;

//用來標記是否到達終點;

while

(tail>top)

if(a[tx]

[ty]==0

&&book[tx]

[ty]==0

)//判斷能否走通

if(tx==ex&&ty==ey)

//走到終點了}if

(cc==1)

top++

;//這個節點所有操作結束,top++繼續下乙個節點

}printf

("%d"

,list[tail-1]

.bs)

;return0;

}

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...

廣度優先搜尋

include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...

廣度優先搜尋

廣度優先搜尋詳解 1.也稱寬度優先搜尋,顧名思義,就是將一棵樹一層一層往下搜。演算法首先搜尋和s距離為k的所有頂點,然後再去搜尋和s距離為k l的其他頂點。bfs是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...