Loading

LC2257 保卫格子

题面

LC2257

代码

class Solution {
public:
    int countUnguarded(int m, int n, vector<vector<int>>& guards, vector<vector<int>>& walls) {
        // we define:
        // 0: non-guarded
        // 1: guarded
        // 2: occupied by guard
        // 3: occupied by wall
        vector<vector<short>> map(m, vector<short>(n, 0));
        for(auto& guard : guards) {
            map[guard[0]][guard[1]] = 2;
        }
        for(auto& wall : walls) {
            map[wall[0]][wall[1]] = 3;
        }

        // start simulate
        for(auto& guard : guards) {
            // mark horizontally
            // going leftmost
            for(int c = guard[1]-1; c >= 0; --c) {
                if(map[guard[0]][c] == 2 || map[guard[0]][c] == 3) {
                    break;
                } else {
                    map[guard[0]][c] = 1; 
                }
            }
            // going rightmost
            for(int c = guard[1]+1; c < n; ++c) {
                if(map[guard[0]][c] == 2 || map[guard[0]][c] == 3) {
                    break;
                } else {
                    map[guard[0]][c] = 1; 
                }
            }
            // going downmost
            for(int r = guard[0]-1; r >= 0; --r) {
                if(map[r][guard[1]] == 2 || map[r][guard[1]] == 3) {
                    break;
                } else {
                    map[r][guard[1]] = 1; 
                }
            }
            // going upmost
            for(int r = guard[0]+1; r < m; ++r) {
                if(map[r][guard[1]] == 2 || map[r][guard[1]] == 3) {
                    break;
                } else {
                    map[r][guard[1]] = 1; 
                }
            }
        }

        long long cnt = 0;
        for(int i = 0; i < m; ++i) {
            for(int j = 0; j < n; ++j) {
                if(!map[i][j]) {
                    ++cnt;
                }
            }
        }
        return cnt;
    }
};

思路

暴力模拟
待续

posted @ 2025-11-17 11:53  kozumi  阅读(5)  评论(0)    收藏  举报