開啟轉盤鎖

2022-09-09 12:36:20 字數 1238 閱讀 7960

你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每個撥輪可以自由旋**例如把 '9' 變為 '0','0' 變為 '9' 。每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 '0000' ,乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字,一旦撥輪的數字和列表裡的任何乙個元素相同,這個鎖將會被永久鎖定,無法再被旋轉。字串 target 代表可以解鎖的數字,你需要給出解鎖需要的最小旋轉次數,如果無論如何不能解鎖,返回-1

示例:輸入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"

輸出:6

解釋:可能的移動序列為 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。

注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 這樣的序列是不能解鎖的,

因為當撥動到 "0102" 時這個鎖就會被鎖定。

public int openlock(string deadends, string target)

if (!visited.contains(strsub) && !set.contains(strsub)) }}

//當前層訪問完了,到下一層,層數要加1

level++;

}return -1;

}分析:

這道題,剛開始做的時候沒有想過用bfs,只是簡單的進行分析,覺得乙個字串中四個字元,每個字元都要兩種變換情況加1和減1。剛開始寫的時候**如下,寫了一點就不會了。

而該題使用bfs。因為初始數字為 '0000' ,把『0000』看作根節點,而對於每乙個字元都有兩種情況,所以根節點的子節點就有八種情況。依次往下推每乙個節點都有八種情況。

但是要注意的是每一層的節點不能重複,所以需要我們記錄每乙個節點的訪問情況,如果訪問則說明已經生成,下面生成的節點要進行比較,相同的不生成。

本題最終要求的是最少改變幾次,而每改變一次最多生成的結果就是樹一層,所以要記錄生成的樹的實時層數,這裡使用level記錄。每生成乙個結點與最終的結果target比較如果相同,此時的level就是最終的結果;如果不相同,則繼續。

9 4 開啟轉盤鎖

題目大意 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。輸出最小的旋轉次數。思路 典型的bfs,因...

Leetcode 開啟轉盤鎖

原題 一道關於bfs的題目 先上 class solution object def openlock self,deadends,target 這裡轉為set類很有必要。deadends set deadends 先判斷是否是特殊情況。if 0000 in deadends or target i...

752 開啟轉盤鎖

題目描述 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字...