題目**於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...