https://leetcode.cn/problems/count-unguarded-cells-in-the-grid/description/

48 阅读1分钟

题目:
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
}