题目:
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
思路:
这道题目求解的其实是连通图数量,不同的岛屿属于不同的连通图; 当遍历到其中一个岛屿时,把这个岛屿给淹了(全部变成0),遇到水都跳过,那么当遍历到另一个陆地时,就是另一个岛屿,执行同样的操作,如此进行直到所有的陆地全部被淹。
C++:
#include<iostream>
#include<vector>
using namespace std;
class Solution
{
private:
int m,n;
public:
void dfs(vector<vector<char>>& grid, int i,int j)
{
// 若越界或是水的情况
if(i<0 || i>=m || j<0 || j>=n || grid[i][j] == '0')
{
return;
}
// 岛屿淹没为水
grid[i][j] = '0';
// 四个方向dfs
dfs(grid, i+1, j);
dfs(grid, i-1, j);
dfs(grid, i, j+1);
dfs(grid, i, j-1);
}
int numIsLand(vector<vector<char>>& grid)
{
if(m == 0) return 0; // 网格大小为0
int m =grid.size();
int n =grid[0].size();
int count = 0;
for(int i = 0;i<m; i++)
{
for(int j=0;j<n;j++)
{
if(grid[i][j] == 1)
{
count++; // 每发现一个岛屿。数量+1
dfs(grid,i,j); // dfs将岛屿淹没
}
}
}
return count;
}
};
python:
class Solution:
def numIslands(self,grid):
m = len(grid)
n = len(grid[0])
res = 0
def dfs(x,y):
if grid[x][y] == '1':
grid[x][y] = '0'
else:
return
if x > 0:
dfs(x-1,y)
if x < m-1:
dfs(x+1,y)
if y > 0:
dfs(x, y-1)
if y< n-1:
dfs(x, y+1)
for i in range(m):
for j in range(n):
if grid[i][j] == '1':
dfs(i,j)
res += 1
return res