bfs:寬度優先搜尋,每次擴充套件最淺的為擴充套件結點。
之前在學習演算法分析這門課的時候對分支界限法有些模糊不清,現在和回溯法對比著來看,突然清晰了。
回溯法:用dfs遍歷解空間樹,用於求出所有可能解,可用棧實現;(棧模擬遞迴)
分支界限法:用bfs遍歷解空間樹,用於求出乙個最優解,用佇列實現。
演算法模板:(模板出處)
// 計算從起點 start 到終點 target 的最近距離
intbfs
(node start, node target)
}/* 劃重點:更新步數在這裡 */
step++;}
}
佇列通常以 fifo(先進先出)的方式排序各個元素,優先順序佇列和 lifo 佇列(或堆疊)例外。
queue
queue =
newlinkedlist();
佇列類的每個方法都存在兩種形式:一種丟擲異常(操作失敗時),另一種返回乙個特殊值(null 或 false,具體取決於操作),如下:
你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字: 『0』, 『1』, 『2』, 『3』, 『4』, 『5』, 『6』, 『7』, 『8』, 『9』 。每個撥輪可以自由旋**例如把 『9』 變為 『0』,『0』 變為 『9』 。每次旋轉都只能旋轉乙個撥輪的一位數字。
鎖的初始數字為 『0000』 ,乙個代表四個撥輪的數字的字串。
列表 deadends 包含了一組死亡數字,一旦撥輪的數字和列表裡的任何乙個元素相同,這個鎖將會被永久鎖定,無法再被旋轉。
字串 target 代表可以解鎖的數字,你需要給出最小的旋轉次數,如果無論如何不能解鎖,返回 -1。
把四位數的每個組合都看作是乙個狀態,每次撥動鎖可以延申出8種狀態,那麼求解此題就變成了找到初始狀態「0000」到目標狀態的最小路徑,利用bfs的思想及模板來完成。
class
solution
string down =
minusone
(cur, j);if
(!visited.
contains
(down))}
}/* 在這裡增加步數 */
step++;}
// 如果窮舉完都沒找到目標密碼,那就是找不到了
return-1
;}// 將 s[i] 向上撥動一次
string plusone
(string s,
int j)
// 將 s[i] 向下撥動一次
string minusone
(string s,
int j)
}
752 開啟轉盤鎖
題目描述 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字...
752 開啟轉盤鎖
你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字,一旦撥輪...
leetcode 752 開啟轉盤鎖
752.開啟轉盤鎖 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一...