Skip to content

Commit a29d8ae

Browse files
authored
Merge pull request #2021 from tahsintunan/778
Create 778. Swim in Rising Water
2 parents 756987e + ca71d40 commit a29d8ae

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

go/0778-swim-in-rising-water.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
var dirs = []int{0, 1, 0, -1, 0}
2+
3+
func swimInWater(grid [][]int) int {
4+
gridSize := len(grid)
5+
minTime, maxTime := grid[0][0], gridSize*gridSize-1
6+
7+
for minTime < maxTime {
8+
middleTime := minTime + (maxTime-minTime)/2
9+
visited := initVisitedArray(gridSize)
10+
if canReach(grid, visited, 0, 0, gridSize, middleTime) {
11+
maxTime = middleTime
12+
} else {
13+
minTime = middleTime + 1
14+
}
15+
}
16+
return minTime
17+
}
18+
19+
func initVisitedArray(gridSize int) [][]bool {
20+
visited := make([][]bool, gridSize)
21+
for i := range visited {
22+
visited[i] = make([]bool, gridSize)
23+
}
24+
return visited
25+
}
26+
27+
func canReach(grid [][]int, visited [][]bool, x, y, gridSize, level int) bool {
28+
visited[x][y] = true
29+
for i := 0; i < 4; i++ {
30+
newX, newY := x+dirs[i], y+dirs[i+1]
31+
if !isValidMove(newX, newY, gridSize) {
32+
continue
33+
}
34+
if visited[newX][newY] || grid[newX][newY] > level {
35+
continue
36+
}
37+
if newX == gridSize-1 && newY == gridSize-1 {
38+
return true
39+
}
40+
if canReach(grid, visited, newX, newY, gridSize, level) {
41+
return true
42+
}
43+
}
44+
return false
45+
}
46+
47+
func isValidMove(x, y, gridSize int) bool {
48+
if y < 0 || x < 0 || y >= gridSize || x >= gridSize {
49+
return false
50+
}
51+
return true
52+
}

0 commit comments

Comments
 (0)