題目鏈結
題目描述:
你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有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...