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 ?>
初始化:
守衛模擬:
計算不受保護的細胞:
n 是網格的尺寸。
計算不受保護的細胞:
O(m * n).
因此,整體複雜度為
以上是計算網格中不受保護的單元格的詳細內容。更多資訊請關注PHP中文網其他相關文章!