43 (BFS)開啟轉盤鎖(LC 752)

2021-10-21 02:17:28 字數 1590 閱讀 1898

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 包含了一...