題目描述:
你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有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』 中產生。
方法1:使用佇列實現廣度優先搜尋
主要思路:
(1)這個題有點類似於使用使用0到9十個字元,可以實現的4個字元長的字串能有多少中,而在這個找的過程中,若是碰到了target字串,就是找到了,對於題目中的deadends字串陣列,可以直接作為訪問過的組合,不再進行訪問,避免deadends;
(2)這樣,就相當於是窮舉,直到滿足要求,根據題意,對於每乙個當前的字串,可以變換的的位是4 位,可以變化的方式是向上或者向下,既每乙個字串的變化可能結果是8個,為了避免重複的字串,既之前已經獲得過的,同樣需要把所有遍歷過的字串壓入到訪問過的集合,避免重複訪問;
(3)這樣,使用佇列儲存每一次動作下,可以獲得所有的新的字串,並將所有訪問過的字串(包括之前的deadends)壓入到 unordered_set visited;避免重複的訪問,既在壓入之前,先判斷之前是否存在過即可;
class
solution
//向下撥動乙個字元
void
down_move
(string& str,
int index)
intopenlock
(vector
& deadends, string target)
//若是deadends中包括初始字串「0000」,則直接返回-1
if(visited.
count
("0000"))
return-1
;//將初始字串壓入到佇列和set中
visited.
insert
("0000");
q.push
("0000");
int moves=0;
//記錄撥動的次數
string cur_str;
//記錄當前使用的字串
string tmp_str;
//輔助上下撥動函式使用的字串
int cur_size=0;
//統計每次撥動下的字串的總的數量
while
(!q.
empty()
)}//遍歷四個向下的動作
for(
int i=
0;i<4;
++i)}}
++moves;
//撥動次數加1
}return-1
;}};
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 包含了一...
開啟轉盤鎖(LeetCode 752)
你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字,一旦撥輪...