...
LC 752. Open the Lock 打开转盘锁
https://leetcode.com/problems/open-the-lock/
Code Block | ||
---|---|---|
| ||
import "fmt"
func openLock(deadends []string, target string) int {
var q []string
visited := make(map[string]bool)
for _, x := range deadends {
visited[x] = true
}
if visited["0000"] {
return -1
}
q = append(q, "0000")
visited["0000"] = true
step := 0
for len(q) > 0 {
qq := q
q = nil
for _, node := range qq {
if node == target {
return step
}
for _, next := range getNext(node) {
if visited[next] {
continue
}
q = append(q, next)
visited[next] = true
}
}
step++
}
return -1
}
func getNext(node string) []string {
result := make([]string, 0, 8)
nb := []byte(node)
add := func(i, x int) {
v := (int(nb[i] - '0') + x + 10) % 10
nb[i] = '0' + byte(v)
}
for i := 0; i < 4; i++ {
add(i, 1)
result = append(result, string(nb))
add(i, -2)
result = append(result, string(nb))
add(i, 1)
}
return result
} |