題目:
你有一個(gè)帶有四個(gè)圓形撥輪的轉(zhuǎn)盤(pán)鎖。每個(gè)撥輪都有10個(gè)數(shù)字:?'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'?臀脏。每個(gè)撥輪可以自由旋轉(zhuǎn):例如把?'9'?變?yōu)?'0'虏冻,'0'?變?yōu)?'9'?肤粱。每次旋轉(zhuǎn)都只能旋轉(zhuǎn)一個(gè)撥輪的一位數(shù)字。
鎖的初始數(shù)字為?'0000'?厨相,一個(gè)代表四個(gè)撥輪的數(shù)字的字符串领曼。
列表?deadends?包含了一組死亡數(shù)字,一旦撥輪的數(shù)字和列表里的任何一個(gè)元素相同蛮穿,這個(gè)鎖將會(huì)被永久鎖定庶骄,無(wú)法再被旋轉(zhuǎn)。
字符串?target?代表可以解鎖的數(shù)字践磅,你需要給出最小的旋轉(zhuǎn)次數(shù)单刁,如果無(wú)論如何不能解鎖,返回 -1府适。
示例 1:
輸入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"輸出:6解釋:可能的移動(dòng)序列為 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"羔飞。注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 這樣的序列是不能解鎖的,因?yàn)楫?dāng)撥動(dòng)到 "0102" 時(shí)這個(gè)鎖就會(huì)被鎖定檐春。
示例 2:
輸入:deadends = ["8888"], target = "0009"輸出:1解釋:把最后一位反向旋轉(zhuǎn)一次即可 "0000" -> "0009"逻淌。
示例 3:
輸入:deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"輸出:-1解釋:無(wú)法旋轉(zhuǎn)到目標(biāo)數(shù)字且不被鎖定。
示例 4:
輸入:deadends = ["0000"], target = "8888"輸出:-1
提示:
死亡列表?deadends?的長(zhǎng)度范圍為?[1, 500]疟暖。
目標(biāo)數(shù)字?target?不會(huì)在?deadends?之中恍风。
每個(gè)?deadends?和?target?中的字符串的數(shù)字會(huì)在 10,000 個(gè)可能的情況?'0000'?到?'9999'?中產(chǎn)生。
goland代碼:
func openLock(deadends []string, target string) int {
? ? deadendsMap := make(map[string]bool)
? ? for _, v := range deadends {
? ? ? ? ? ?if v == "0000" {
? ? ? ? ? ? ? ? ? return -1
? ? ? ? ? ? }
? ? ? ? deadendsMap[v] = true
? ? ? }
? ? ? return bfs(deadendsMap, target)
}
func bfs(deadendsMap map[string]bool, target string) int {
????start, step := "0000", 0
????tmp0, tmp9 := byte('0'-1), byte('9'+1)
????used := make(map[string]bool)
????used[start] = true
????queue := list.New()
????queue.PushBack(start)
????for queue.Len() > 0 {
????????l := queue.Len()
????????for i := 0; i < l; i++ {
????????????v, _ := queue.Remove(queue.Front()).(string)
? ? ? ? ? ? if deadendsMap[v] {
? ? ? ? ? ? ? ? continue
????????????}
? ? ? ? ? ? if v == target {
????????????????return step
????????????}
????????????tmpv_a := []byte(v)
? ? ? ? ? ? tmpv_b := []byte(v)
????????????for ti := 0; ti < 4; ti++ {
????????????????tmpv_a[ti]++
? ? ? ? ? ? ? ? tmpv_b[ti]--
????????????????if tmpv_a[ti] == tmp9 {
????????????????????tmpv_a[ti] = '0'
????????????????}
? ? ? ? ? ? ? ? if tmpv_b[ti] == tmp0 {
????????????????????tmpv_b[ti] = '9'
????????????????}
????????????????if !used[string(tmpv_a)] {
????????????????????queue.PushBack(string(tmpv_a))? ?
????????????????????used[string(tmpv_a)] = true
????????????????}
? ? ? ? ? ? ? ? if !used[string(tmpv_b)] {
????????????????????queue.PushBack(string(tmpv_b))
????????????????????used[string(tmpv_b)] = true
????????????????}
? ? ? ? ? ? ? ? tmpv_a[ti] = v[ti]
????????????????tmpv_b[ti] = v[ti]
????????????}
????????}
? ? ? ? step++
????}
????return -1
}