题目:
leetcode.cn/problems/co…
算法:
方法一:模拟
don't afraid to dirty your hands。
时间复杂度O(m*n), 10^5 可以过,实在不行试试再说,不要怕弄脏了手就不敢写。
func countUnguarded(m int, n int, guards [][]int, walls [][]int) int {
grid := make([][]int, m)
for i := range grid {
grid[i] = make([]int, n)
}
// grid[i][j] = 1 守卫
// = 2 城墙
// = 3 守卫看到的区域
// = 0 未守卫的区域
for i := range guards {
grid[guards[i][0]][guards[i][1]] = 1
}
for i := range walls {
grid[walls[i][0]][walls[i][1]] = 2
}
dirs := [][]int{[]int{0, 1},[]int{0, -1},[]int{1, 0},[]int{-1, 0}}
for i := range guards {
// 守卫向上下左右四个方向,看,知道看到城墙或者其他守卫位为止,结束标记
for _, dir := range dirs {
x := guards[i][0] + dir[0]
y := guards[i][1] + dir[1]
for 0 <= x && x < m && 0 <= y && y < n && grid[x][y] != 1 && grid[x][y] != 2 {
grid[x][y] = 3
x = x + dir[0]
y = y + dir[1]
}
}
}
count := 0
for i := range grid {
for j := range grid[i] {
if grid[i][j] == 0 {
count ++
}
}
}
// fmt.Println(grid)
return count
}