層序遍歷之開啟轉盤鎖

2021-10-08 02:22:21 字數 3267 閱讀 8183

題目**於leetcode

你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字: 『0』, 『1』, 『2』, 『3』, 『4』, 『5』, 『6』, 『7』, 『8』, 『9』 。每個撥輪可以自由旋**例如把 『9』 變為 『0』,『0』 變為 『9』 。每次旋轉都只能旋轉乙個撥輪的一位數字。

鎖的初始數字為 『0000』 ,乙個代表四個撥輪的數字的字串。

列表 deadends 包含了一組死亡數字,一旦撥輪的數字和列表裡的任何乙個元素相同,這個鎖將會被永久鎖定,無法再被旋轉。

字串 target 代表可以解鎖的數字,你需要給出最小的旋轉次數,如果無論如何不能解鎖,返回 -1。

示例 1:

輸入:deadends = [「0201」,「0101」,「0102」,「1212」,「2002」], target = 「0202」

輸出:6

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

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

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

示例 2:

輸入: deadends = [「8888」], target = 「0009」

輸出:1

解釋:把最後一位反向旋轉一次即可 「0000」 -> 「0009」。

示例 3:

輸入: deadends = [「8887」,「8889」,「8878」,「8898」,「8788」,「8988」,「7888」,「9888」], target = 「8888」

輸出:-1

解釋:無法旋轉到目標數字且不被鎖定。

示例 4:

輸入: deadends = [「0000」], target = 「8888」

輸出:-1

死亡列表 deadends 的長度範圍為 [1, 500]。

目標數字 target 不會在 deadends 之中。

每個 deadends 和 target 中的字串的數字會在 10,000 個可能的情況 『0000』 到 『9999』 中產生。

對於每個密碼有8種操作(一位2種操作,密碼有4位),你可以把本此題看作一顆樹處理,把target作為根節點,8種操作作為子節點,進行廣度優先遍歷,直到得到「0000」為止。遍歷過程中不能把deadends中的死亡數字作為根節點,也不能將已經被遍歷過的節點作為根節點,所以可以把已經遍歷過的密碼加入到deadends中,確保每次遍歷過程中都得到的是新的密碼以及不是死亡密碼,遍歷過程就是這樣。

如何得到結果呢?我們需要定義乙個result作為結果,result的值就是樹的深度-1。那如何判斷遍歷時從上一層到達了下一層,也就是什麼時result++呢?我們只需要在每一層的末尾新增乙個null,當遍歷得到的結果為null是,說明要進入下一層了,此時執行result++。

class

solution

return j;}/*

* 定義移動單個撥輪-1的操作

* */

public

static

char

actionsubtract

(char i)

if(i ==

'0')

return j;}/*

* 定義分別移動四個撥輪的操作,執行此操作後可得新的8種轉盤鎖的狀態

* */

public

static list

action

(string str)

return list;

}public

intopenlock

(string[

] deadends, string target)

else

if(s.

equals

("0000"))

else}}

}return-1

;}}

linkedlist的poll()方法:檢索並刪除此列表的頭部(第乙個元素),返回值是被刪除的元素

linkedlist的peek()方法:檢索但不刪除此列表的頭部(第乙個元素),返回值是第乙個元素

linkedlist的offer​(e e)方法:將指定的元素新增為此列表的尾部(最後乙個元素)。

hashset的contains​(object o) 方法:如果此set包含指定的元素,則返回 true 。

arrays類的copyof()方法和copyofrange()方法用來複製陣列:

string string =

"abc"

;char

str = string.

tochararray()

;char

newstr1 = arrays.

copyof

(str, str.length)

;char

newstr2 = arrays.

copyofrange

(str,0,

3);

arrays 類的 copyof() 方法的語法格式如下:

arrays.copyof(datatype srcarray,int length);

其中,srcarray 表示要進行複製的陣列,length 表示複製後的新陣列的長度。

使用這種方法複製陣列時,預設從源陣列的第乙個元素(索引值為 0)開始複製,目標陣列的長度將為 length。如果 length 大於 srcarray.length,則目標陣列中採用預設值填充;如果 length 小於 srcarray.length,則複製到第 length 個元素(索引值為 length-1)即止。

arrays 類的 copyofrange() 方法是另一種複製陣列的方法,其語法形式如下:

arrays.copyofrange(datatype srcarray,int startindex,int endindex)

其中,srcarray 表示源陣列;startindex 表示開始複製的起始索引,目標陣列中將包含起始索引對應的元素,另外,startindex 必須在 0 到 srcarray.length 之間;endindex 表示終止索引,目標陣列中將不包含終止索引對應的元素,endindex 必須大於等於 startindex,可以大於 srcarray.length,如果大於 srcarray.length,則目標陣列中使用預設值填充。

開啟轉盤鎖

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

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...