首先先來一題例題來解釋做乙個引子吧:
比如:從3開始先選擇一條路來走的話,從3到2然後繼續往後走到1到0,在1就不能繼續往後走了,就開始回溯了。從0到1,再到2,發現2還可以走到4然後再從4走到5,再返回4返回到3,再從3到6再到5。
這個地方有提到用棧來優化深度優先搜尋。這個我覺得可以想想,比如走一條路的時候不斷的把結點入隊,走到路的盡頭的時候就把結點出隊,直到某個結點還有其他相連的路為止。(這個是個人思考後面看看能不能再找乙個部落格來搞)。
其實之前我也有入門學過,但是當時還沒有比較好的程式設計的思維所以就很不熟。現在重新撿起來。其實廣度優先搜尋就像乙個廣撒網的感覺。一層層的往下搜尋直到找到需要找的點為止。注意在搜尋的過程中要判重。肯定不能找已經走過的點。
後面是廣度優先演算法的基本步驟:
接下來的幾張圖來好好的解釋一下怎麼使用open表和closed表來進行廣搜的過程:
第一步;把起點入open佇列。
第二步:把3出隊,通過二維陣列或者是鄰接表來確定與3相連的結點,把這些結點入隊。
第三步:就是把隊首元素給彈出來,然後把與這個元素相連的元素給壓入佇列尾就好了。就這樣進行迴圈直到佇列尾與頭相等(也就是佇列是空的時候)則無解。或者是直到彈出的元素剛好是終點的時候,那麼就是找到這條路了!
後面進行**演示:
#include #include下篇部落格來講幾篇迷宮問題吧!#include
using
namespace
std;
intn, k;
const
int maxn = 1000;//
最大的結點數
int visited[maxn + 10];//
視覺化陣列
struct
step
//函式的過載,其實可以理解成乙個將step當成乙個函式用
//比如每一次將這個元素壓入佇列的時候用這個可以直接把相關的數搞進來
};queue
q;int
main()
else
if (s.x + 1
<=maxn && !visited[s.x + 1
])
if (s.x*2
<= maxn && !visited[s.x*2
]) }
q.pop();
}return0;
}
深搜和廣搜入門
1.描述 對每乙個可能的分支路徑深入到不能再深為止,並且每個結點只能訪問一次。一條路走到黑,走不了再倒回去 2.演算法過程 void dfs 狀態 1.判斷當前狀態是否合法,合法則繼續執行,否則則回到上次呼叫 2.遍歷每個新狀態,如果新狀態合法,dfs 新狀態 3.示例 洛谷 p2802回家 inc...
廣搜入門(簡單易懂
這裡需要用到 佇列!題目 農夫要抓牛,農夫可以向前走一步,向後走一步,向前走x步 x為農夫座標 求最短走幾次可以走到牛的座標。模板 1 為了方便,定義乙個結構體,代表當前x 座標 steps 走了多少步 2 建立乙個結構體佇列a,queuea 2 將起點,即農夫座標加入佇列,此時佇列只有乙個元素,編...
廣搜入門(簡單易懂
這裡需要用到 佇列!題目 農夫要抓牛,農夫可以向前走一步,向後走一步,向前走x步 x為農夫座標 求最短走幾次可以走到牛的座標。模板 1 為了方便,定義乙個結構體,代表當前x 座標 steps 走了多少步 2 建立乙個結構體佇列a,queuea 2 將起點,即農夫座標加入佇列,此時佇列只有乙個元素,編...