廣度優先演算法(BFS) 地牢逃脫

2021-09-08 01:56:50 字數 3096 閱讀 7150

廣度優先演算法,又稱寬度優先搜尋或橫向優先搜尋。簡稱為bfs。

本質:圖的遍歷(或搜尋)。

定義:從圖中某個頂點出發,訪問所有頂點,且每個頂點僅訪問一次。(包括連通圖和非連通圖)

適用

1、訪問頂點vi ;

2、訪問vi 的所有未被訪問的鄰接點w1 ,w2 , …wk ;

3、依次從這些鄰接點(在步驟②中訪問的頂點)出發,訪問它們的所有未被訪問的鄰接點; 依此類推,直到圖中所有訪問過的頂點的鄰接點都被訪問;

重要:有乙個值來標誌某一節點是否被訪問過。

網易地牢逃脫

給定乙個 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'x' 表示不可通行的障礙,

牛牛從 (x0 , y0 ) 位置出發,遍歷這個地牢,和一般的遊戲所不同的是,他每一步只能按照一些指定的步長遍歷地牢,

要求每一步都不可以超過地牢的邊界,也不能到達障礙上。地牢的出口可能在任意某個可以通行的位置上。

牛牛想知道最壞情況下,他需要多少步才可以離開這個地牢。 

輸入描述:

每個輸入包含 1 個測試用例。每個測試用例的第一行包含兩個整數 n 和 m(1 <= n, m <= 50),表示地牢的長和寬。

接下來的 n 行,每行 m 個字元,描述地牢,地牢將至少包含兩個 '.'。

接下來的一行,包含兩個整數 x0, y0,表示牛牛的出發位置

(0 <= x0 < n, 0 <= y0 < m,左上角的座標為 (0, 0),出發位置一定是 '.')。

之後的一行包含乙個整數 k(0 < k <= 50)表示牛牛合法的步長數,

接下來的 k 行,每行兩個整數 dx, dy 表示每次可選擇移動的行和列步長(-50 <= dx, dy <= 50)

輸出描述:

輸出一行乙個數字表示最壞情況下需要多少次移動可以離開地牢,如果永遠無法離開,輸出 -1。

以下測試用例中,牛牛可以上下左右移動,在所有可通行的位置.上,地牢出口如果被設定在右下角,

牛牛想離開需要移動的次數最多,為3次。

輸入例子1:

3 3...

......

0 14

1 00 1

-1 0

0 -1

輸出例子1:

3

問題分解

出口在任意某個通行位置上,最壞情況下,多少步離開地牢。

最壞情況,剛開始理解為了,最多要多少步。其實非也,當出口不確定時,最壞情況是指,出口離起點最遠,需要遍歷所有點。

而是否最遠,起點到出口的最短路徑衡量。

遍歷所有點+最短路徑=廣度優先演算法

結構分析

需要進行座標運算,封裝point類可以簡化**

廣度優先一般用佇列實現。當起點入隊之後,需要以佇列是否為空為條件迴圈,while結構。

儲存結構

地牢描述,是乙個n*m的二維陣列,儲存該點可通行'.'或障礙物'x'

是否經過該點,用列表儲存遍歷過的下標。

路徑,也就是走了幾步,需要乙個和地牢描述結構相同的二維陣列儲存。起始值均為1。當滿足乙個點為下乙個點的可通行節點時,對應值增加1。

**展示

import queue

class point(object):

def __init__(self,x,y):

self.x=x

self.y=y

@property

def isok(self):

if 0<=self.x

return true

else:

return false

def go(self,d):

return point(self.x+d[0],self.y+d[1])

if __name__=='__main__':

n,m=[int(x) for x in input().split()]

a= #二維陣列描述地牢

use_point=0

for i in range(n):

use_point+=a[i].count('.')

x0,y0=[int(x) for x in input().split()]

k=int(input())

kli= #儲存步長

for i in range(k):

dx,dy=(int(x) for x in input().split())

print(n,m)

print(a)

print(x0,y0)

print(k)

print(kli)

tt_li=

start=point(x0,y0)

q=queue.queue()

q.put(start)

eli=[[0 for j in range(m)]for i in range(n)]

while not q.empty():

temp=q.get()

for i in kli:

next_point=temp.go(i)

ttemp=(next_point.x,next_point.y)

if next_point.isok and (ttemp not in tt_li):

q.put(next_point)

eli[next_point.x][next_point.y]=eli[temp.x][temp.y]+1

if len(tt_li)==use_point:

temppp=

for x in eli:

print(max(temppp))

else:

print(-1)

地牢逃脫 BFS

題意 給定乙個 n 行 m 列的地牢,其中 表示可以通行的位置,x 表示不可通行的障礙,牛牛從 x0 y0 位置出發,遍歷這個地牢,和一般的遊戲所不同的是,他每一步只能按照一些指定的步長遍歷地牢,要求每一步都不可以超過地牢的邊界,也不能到達障礙上。地牢的出口可能在任意某個可以通行的位置上。牛牛想知道...

演算法 廣度優先搜尋 BFS

廣度優先搜尋主要解決兩類問題 1 從a節點出發,有到b節點的路徑麼?2 從a節點出發,到b節點的最短路徑是什麼?演算法複雜度為o v e 其中v為頂點,e為邊數。例 假設你要在朋友中找乙個芒果銷售商,如果朋友中沒有,則找朋友的朋友,即人際關係網。實現的是第一類問題,在你的人際關係王忠,能找到芒果銷售...

BFS廣度優先搜尋演算法

廣度優先搜尋 bfs 包含一下幾個關鍵點 1.狀態 2.狀態轉移方式 3.有效狀態 4.佇列 5.標記 void bfs 起始點 隊列為空,廣搜結束 看乙個例子 說有一天公主被大魔王抓了,關進了乙個迷宮裡,需要你這位勇士去營救 當然成功了就自然是公升職加薪贏取白富美啦 這個迷宮以二維陣列的形式給出 ...