步步為營(十六)搜尋(二)BFS 廣度優先搜尋

2022-08-18 00:54:08 字數 1795 閱讀 4483

首先,讓我們回顧一下什麼是「深度」:

更學術點的說法,能夠看做「單位距離下,離起始狀態的長度」

那麼廣度是什麼呢?

個人認為,能夠這麼歸納:

何為廣度? 能夠看做「距離初始狀態距離相等的結點」的集合

這樣就保證了:假設我如今找到了目標結點(也能夠稱作當前問題的解)。那麼我之前肯定沒有發現過目標結點,並且因為是廣度優先搜尋。所以當前的解一定是距離起始結點近期的,也就是最優解。因為第乙個解就是最優解,那麼我們就能夠嘗試列印出道路。

偽**例如以下:

queue 結點佇列

queue.push(起始節點)

while(結點佇列不為空)

for(對下一層結點進行推斷)

}}

從s點開始,設s點座標為(1,1)

(1,1)

->(1,2)//第一層

->(2,1)//第一層

->(3,1)//第二層

->(3,2)//第三層

->(4,1)//第三層

…… ->(5,5)//找到目標結點,結束

bfs因為維護了乙個佇列。所以節省了遞迴須要消耗的時間,可是空間上卻比遞迴消耗的多的多。假設須要找多個解或者每乙個節點的狀態比較多。可能會面臨空間超限的情況。

所以:

求多個解,首先考慮dfs;

求單個解,首先考慮bfs

代表題目:hdu 1072 nightmare

題目大意:在迷宮中有乙個炸彈,過六個單位時間就會**。要你求乙個起點到迷宮的終點的最短距離,迷宮中有時間重置器,當你走到這個格仔。炸彈的**時間又一次置為0,迷宮中標識為牆壁的格仔不能走。到達隨意乙個格仔時,炸彈計數器為0時,則失敗。

解題思路:最短距離。就想到用寬度優先遍歷,可是要乙個輔助的陣列來儲存每乙個格仔的時間資訊。因為每乙個格仔前進一步的花費時間單位是一樣的,所以寬度遍歷的結果自然是最短距離。因為時間單位有限制。僅僅能走六個單元,僅僅有在這六個時間單位裡到達了終點,或者走到了時間設定開關把炸彈計時器置為0才幹繼續走下去,所以要乙個輔助陣列來儲存每乙個格仔剩餘的最大時間單位,僅僅有走到當前的格仔的剩餘時間單位比之前的大時。這個狀態才幹增加佇列中。

以下是**:

#include 

#include

#include

#include

#include

#include

using

namespace

std;

struct node

;const

int maxn = 9;

int dir[4][2] = , , , };

int maze[maxn][maxn], graph[maxn][maxn];

int n, m, ex, ey, ans;

bool bfs(int x, int y);

int main()

}if(bfs(sx, sy))

printf("%d\n", ans);

else

printf("-1\n");

}return0;}

bool bfs(int x, int y)

if(st.t == 1)

continue;

for(int i = 0; i < 4; i++)}}

}return

false;

}

步步為營 79 快取

快取cache,一種空間換取時間的技術,適用於經常訪問,不常修改的資料.1 寫入快取 1.1 方法一 cache message ab 1.2 方法二 cache.insert message ab 1.3 其他過載 insert string key,object value,cachedepen...

步步為營 50 事務

說明 比較常用 1 事務的四大特性 1.1 原子性atomicity 乙個事務中包含的多個sql語句,要麼同時成功,要麼同時失敗.1.2 一致性consistency 事務必須使資料庫從從乙個一致性狀態變成另外乙個一致性狀態.銀行轉賬 1.3 隔離性 isolation 各個事務執行互不干擾 鎖 1...

io nio socket步步為營(三)NIO

原理 運用reactor模式 selector是核心 分發器a multiplexor of selectablechannel objects。能檢測任意個註冊過的channel上的事件,並分發事件,內部實現不用考慮,封裝的好處。client沒必要用nio,使用中的client server,需要...