力扣 開啟轉盤鎖

2021-10-03 04:06:13 字數 1997 閱讀 4599

題目鏈結

題目描述:

你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字: '0'

,'1'

,'2'

,'3'

,'4'

,'5'

,'6'

,'7'

,'8'

,'9' 。每個撥輪

可以自由旋**例如把 '9' 變為 '0','0' 變為 '9' 。每次旋轉都只能旋轉乙個撥輪的一位數字。

1.鎖的初始數字為 '0000' ,乙個代表四個撥輪的數字的字串。

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

3.字串 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

c++實現:

class

solution

return

false;}

intopenlock

(vector

& deadends, string target)

while

(!qs.

empty()

) st=sc;

st[x]=(

((st[x]

-'0')+

('1'

-'0'))

%10)+

'0';

//向後翻轉

if(st==target)

return step;

//找到目標返回當前層數

elseif(

!index.

count

(st)

)//如果不在並查集中壓入佇列和並查集}}

}return-1

;//沒有找到輸出-1}}

;

題目分析:

題解參考

開啟轉盤鎖

你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有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...