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
|
func minTimeToDestination(land [][]byte) int {
n, m := len(land), len(land[0])
flood := make([][]int, n)
for i := range flood { flood[i] = make([]int, m); for j := range flood[i] { flood[i][j]=1<<30 } }
var sx, sy, dx, dy int
q := [][2]int{}
for i := 0; i < n; i++ { for j := 0; j < m; j++ {
if land[i][j]=='*' { flood[i][j]=0; q=append(q,[2]int{i,j}) }
if land[i][j]=='S' { sx=i; sy=j }
if land[i][j]=='D' { dx=i; dy=j }
}}
dirs := [][2]int{{0,1},{1,0},{0,-1},{-1,0}}
for h:=0; h<len(q); h++ {
x,y := q[h][0],q[h][1]
for _,d := range dirs {
nx,ny := x+d[0],y+d[1]
if nx>=0&&nx<n&&ny>=0&&ny<m&&land[nx][ny]=='.'&&flood[nx][ny]>flood[x][y]+1 {
flood[nx][ny]=flood[x][y]+1; q=append(q,[2]int{nx,ny})
}
}
}
vis := make([][]int, n)
for i := range vis { vis[i]=make([]int,m); for j:=range vis[i]{vis[i][j]=1<<30} }
q2 := [][3]int{{sx,sy,0}}
vis[sx][sy]=0
for h:=0; h<len(q2); h++ {
x,y,t := q2[h][0],q2[h][1],q2[h][2]
if x==dx&&y==dy { return t }
for _,d := range dirs {
nx,ny,nt := x+d[0],y+d[1],t+1
if nx>=0&&nx<n&&ny>=0&&ny<m&&land[nx][ny]!='X'&&nt<flood[nx][ny]&&nt<vis[nx][ny] {
vis[nx][ny]=nt; q2=append(q2,[3]int{nx,ny,nt})
}
}
}
return -1
}
|