PHP-岛屿数量问题

岛屿数量

题意

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围

示例 1:

输入:
11110
11010
11000
00000
输出: 1

示例 2:

输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

解题思路:DFS 深度优先算法(Depth 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 

你可能感兴趣的:(PHP-岛屿数量问题)