-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathlock.go
88 lines (76 loc) · 1.6 KB
/
lock.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package lock
import "container/list"
func openLock(deadends []string, target string) int {
for _, v := range deadends {
if v == "0000" {
return -1
}
}
return bfs(deadends, target)
}
func bfs(deadends []string, target string) int {
//初始化起始数字并转换为[]byte和需要返回的最小转换步数
start, step := "0000", 0
//标记2种位变量
tmp0, tmp9 := byte('0'-1), byte('9'+1)
//记录已经访问的数字并记录start
used := map[string]bool{}
used[start] = true
//开启队列并插入start
queue := list.New()
queue.PushBack(start)
for queue.Len() > 0 {
l := queue.Len()
step++
for i := 0; i < l; i++ {
v, ok := queue.Remove(queue.Front()).(string)
if !ok {
panic("get queue value error")
}
tmpv := []byte(v)
addqueue9:
for ti := 0; ti < 4; ti++ {
tmpv[ti]++
if tmpv[ti] == tmp9 {
tmpv[ti] = '0'
}
for _, s := range deadends {
if s == string(tmpv) {
tmpv[ti] = v[ti]
continue addqueue9
}
}
if !used[string(tmpv)] {
queue.PushBack(string(tmpv))
used[string(tmpv)] = true
}
if string(tmpv) == target {
return step
}
tmpv[ti] = v[ti]
}
addqueue0:
for ti := 0; ti < 4; ti++ {
tmpv[ti]--
if tmpv[ti] == tmp0 {
tmpv[ti] = '9'
}
for _, s := range deadends {
if s == string(tmpv) {
tmpv[ti] = v[ti]
continue addqueue0
}
}
if !used[string(tmpv)] {
queue.PushBack(string(tmpv))
used[string(tmpv)] = true
}
if string(tmpv) == target {
return step
}
tmpv[ti] = v[ti]
}
}
}
return -1
}