题目
解法
依题遍历陆地的四个边,如果靠近水,那么算到周长里面,否则不算
<?php
class Solution {
/**
* @param Integer[][] $grid
* @return Integer
*/
function islandPerimeter($grid) {
if (empty($grid)) {
return 0;
}
$per = 0;
foreach ($grid as $rowKey => $rowGrid) {
foreach ($rowGrid as $colKey => $colItem) {
if ($colItem != 1) {
continue;
}
$per += intval(!isset($grid[$rowKey - 1][$colKey]) || $grid[$rowKey - 1][$colKey] == 0);
$per += intval(!isset($grid[$rowKey][$colKey + 1]) || $grid[$rowKey][$colKey + 1] == 0);
$per += intval(!isset($grid[$rowKey + 1][$colKey]) || $grid[$rowKey + 1][$colKey] == 0);
$per += intval(!isset($grid[$rowKey][$colKey - 1]) || $grid[$rowKey][$colKey - 1] == 0);
}
}
return $per;
}
}
还有一种深度遍历的方式
class Solution {
/**
* @param Integer[][] $grid
* @return Integer
*/
function islandPerimeter($grid) {
if (empty($grid)) {
return 0;
}
$per = 0;
foreach ($grid as $rowKey => $rowGrid) {
foreach ($rowGrid as $colKey => $colItem) {
if ($grid[$rowKey][$colKey] == 1) {
$per += $this->dfs($grid, $rowKey, $colKey);
}
}
}
return $per;
}
public function dfs(&$grid, $rowKey, $colKey) {
if (!isset($grid[$rowKey][$colKey])) {
return 0;
}
if ($grid[$rowKey][$colKey] == 0) {
return 0;
}
if ($grid[$rowKey][$colKey] == 2) {
return 0;
}
$grid[$rowKey][$colKey] = 2;
$per = 0;
$per += intval(!isset($grid[$rowKey - 1][$colKey]) || $grid[$rowKey - 1][$colKey] == 0);
$per += intval(!isset($grid[$rowKey][$colKey + 1]) || $grid[$rowKey][$colKey + 1] == 0);
$per += intval(!isset($grid[$rowKey + 1][$colKey]) || $grid[$rowKey + 1][$colKey] == 0);
$per += intval(!isset($grid[$rowKey][$colKey - 1]) || $grid[$rowKey][$colKey - 1] == 0);
$per += $this->dfs($grid, $rowKey - 1, $colKey);
$per += $this->dfs($grid, $rowKey, $colKey + 1);
$per += $this->dfs($grid, $rowKey + 1, $colKey);
$per += $this->dfs($grid, $rowKey, $colKey - 1);
return $per;
}
}