752 開啟轉盤鎖

2021-10-07 21:34:45 字數 2406 閱讀 8912

題目描述:

你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有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 包含了一組死亡數字,一旦撥輪...