题意
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
解题思路:BFS 广度优先算法(Breadth-First-Search)
解题代码
class Solution {
private $isArr = [];
/**
* @param String[][] $grid
* @return Integer
*/
public function numIslands($grid) {
$num = 0;
for ($i = 0;$i < count($grid);$i++) {
for ($j = 0;$j < count($grid[$i]);$j++) {
if ($grid[$i][$j] == 1 && $this->isArr[$i][$j] != true) {
$num++;
$this->getPath($grid, $i, $j);
}
}
}
return $num;
}
private function getPath($grid, $i, $j){
if ($i < 0 || $i >= count($grid)) {
return;
}
if ($j < 0 || $j >= count($grid[$i])) {
return;
}
if ($grid[$i][$j] != 1 || $this->isArr[$i][$j] == true) {
return;
}
$this->isArr[$i][$j] = true;
$this->getPath($grid, $i - 1, $j);
$this->getPath($grid, $i + 1, $j);
$this->getPath($grid, $i, $j - 1);
$this->getPath($grid, $i, $j + 1);
}
}
测试
$arr[] = [1, 1, 1, 1, 0, 0];
$arr[] = [1, 1, 0, 1, 0, 0];
$arr[] = [1, 1, 0, 0, 1, 1];
$arr[] = [0, 0, 0, 0, 0, 1];
$arr[] = [0, 0, 0, 0, 1, 1];
print_r((new Solution())->numIslands($arr)); //输出 2
网友评论