直接把上次那個題拿來充個數:
題目背景給定乙個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是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...