-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
67 lines (58 loc) · 1019 Bytes
/
main.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
package main
import "fmt"
func main() {
fmt.Println(shortestPath(
[][]int{
{0, 0, 0},
{1, 1, 0},
{0, 0, 0},
{0, 1, 1},
{0, 0, 0}},
2,
))
}
func shortestPath(grid [][]int, k int) int {
var (
q = [][3]int{
{0, 0, k},
}
visited = make(map[[3]int]bool)
dirs = [4][2]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
cost int
)
for len(q) > 0 {
size := len(q)
for i := 0; i < size; i++ {
n := q[0]
q = q[1:]
x, y, r := n[0], n[1], n[2]
if x == len(grid)-1 && y == len(grid[0])-1 {
return cost
}
for _, dir := range dirs {
xx, yy := x+dir[0], y+dir[1]
if xx < 0 || xx >= len(grid) || yy < 0 || yy >= len(grid[0]) {
continue
}
rr := r
if grid[xx][yy] == 1 {
if rr == 0 {
continue
}
rr--
}
if !visited[[3]int{xx, yy, rr}] {
visited[[3]int{xx, yy, rr}] = true
q = append(q, [3]int{xx, yy, rr})
}
}
}
cost++
}
return -1
}
/*
[[0,1,0,0,0,1,0,0]
,[0,1,0,1,0,1,0,1]
,[0,0,0,1,0,0,1,0]]
*/