2257。计算网格中不受保护的单元
难度:中等
主题:数组、矩阵、模拟
给定两个整数 m 和 n,表示 0 索引 m x n 网格。您还获得两个 2D 整数数组 Guards 和 Walls,其中 Guards[i] = [rowi, coli] 和 Walls[j] = [rowj, colj] 代表第 ith 个守卫的位置,分别是第 j 面墙。
警卫可以从其位置开始看到四个基本方向(北、东、南或西)的每个牢房,除非被墙壁或其他警卫阻挡。如果有至少一名守卫可以看到某个牢房,则该牢房受到看守。
返回不受保护的未占用单元格的数量。
示例1:
示例2:
约束:
提示:
解决方案:
我们需要标记至少由一名守卫看守的单元格。守卫可以看到四个基本方向(北、南、东、西),但他们的视线被墙壁阻挡。我们可以模拟这个过程并计算不受保护的单元格的数量。
网格初始化:创建一个二维数组来表示网格。当我们迭代时,用墙壁、守卫和守卫区域标记单元格。
模拟警卫覆盖范围:
计算不受看守的单元格:处理完所有守卫后,对既不是墙壁、守卫、也没有看守的单元格进行计数。
让我们用 PHP 实现这个解决方案:2257。计算网格中不受保护的单元格
<?php /** * @param Integer $m * @param Integer $n * @param Integer[][] $guards * @param Integer[][] $walls * @return Integer */ function countUnguarded($m, $n, $guards, $walls) { ... ... ... /** * go to ./solution.php */ } // Example 1 $m = 4; $n = 6; $guards = [[0, 0], [1, 1], [2, 3]]; $walls = [[0, 1], [2, 2], [1, 4]]; echo countUnguarded($m, $n, $guards, $walls); // Output: 7 // Example 2 $m = 3; $n = 3; $guards = [[1, 1]]; $walls = [[0, 1], [1, 0], [2, 1], [1, 2]]; echo countUnguarded($m, $n, $guards, $walls); // Output: 4 ?>
初始化:
守卫模拟:
计算不受保护的细胞:
因此,整体复杂度为 O(m * n),在给定问题约束的情况下,这是有效的。
联系链接
如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!
如果您想要更多类似的有用内容,请随时关注我:
以上是计算网格中不受保护的单元格的详细内容。更多信息请关注PHP中文网其他相关文章!