文章目录
- 1. 题目
- 2. 解题
1. 题目
给你两个整数 m 和 n 表示一个下标从 0 开始的 m x n 网格图。
同时给你两个二维整数数组 guards 和 walls ,其中 guards[i] = [rowi, coli]
且 walls[j] = [rowj, colj]
,分别表示第 i 个警卫和第 j 座墙所在的位置。
一个警卫能看到 4 个坐标轴方向(即东、南、西、北)的 所有 格子,除非他们被一座墙或者另外一个警卫 挡住 了视线。
如果一个格子能被 至少 一个警卫看到,那么我们说这个格子被 保卫 了。
请你返回空格子中,有多少个格子是 没被保卫 的。
示例 1:
输入:m = 4, n = 6,
guards = [[0,0],[1,1],[2,3]],
walls = [[0,1],[2,2],[1,4]]
输出:7
解释:上图中,被保卫和没有被保卫的格子分别用红色和绿色表示。
总共有 7 个没有被保卫的格子,所以我们返回 7 。
示例 2:
输入:m = 3, n = 3,
guards = [[1,1]],
walls = [[0,1],[1,0],[2,1],[1,2]]
输出:4
解释:上图中,没有被保卫的格子用绿色表示。
总共有 4 个没有被保卫的格子,所以我们返回 4 。提示:
1 <= m, n <= 10^5
2 <= m * n <= 10^5
1 <= guards.length, walls.length <= 5 * 10^4
2 <= guards.length + walls.length <= m * n
guards[i].length == walls[j].length == 2
0 <= rowi, rowj < m
0 <= coli, colj < n
guards 和 walls 中所有位置 互不相同 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-unguarded-cells-in-the-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 按题意模拟
class Solution {
public:int countUnguarded(int m, int n, vector<vector<int>>& guards, vector<vector<int>>& walls) {vector<vector<int>> g(m, vector<int>(n,0));vector<vector<int>> dir = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};int police = 1, wall = 2, mark = 3;for(auto& p : guards)g[p[0]][p[1]] = police;for(auto& w : walls)g[w[0]][w[1]] = wall;for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(g[i][j]==police){ for(int k = 0; k < 4; ++k){int nx = i, ny = j;while(1){nx += dir[k][0], ny += dir[k][1];if(nx>=0 && nx<m && ny>=0 && ny<n){if(g[nx][ny]==police || g[nx][ny]==wall)break;g[nx][ny] = mark;}elsebreak;}}}}}int ans = 0;for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(g[i][j]==0)ans++;}}return ans;}
};
484 ms 150.4 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!