给你一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"] ] 输出:1
示例 2:
输入:grid = [ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"], ["0","0","0","1","1"] ] 输出:3
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j]
的值为'0'
或'1'
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if (!grid.size()) return 0;
int x = grid.size();
int y = grid[0].size();
int parent[x * y];
for (int i=0; i<x; ++i) {
for (int j=0; j<y; ++j) {
if (grid[i][j] == '0') parent[i*y + j] = -1;
else parent[i*y + j] = i*y + j;
}
}
for (int i=0; i<x-1; ++i) {
for (int j=0; j<y-1; ++j) {
if (grid[i][j] == '0') {
parent[i*y+j] = -1;
continue;
}
// 如果右边是陆地
if (grid[i][j] == '1' && grid[i][j+1] == '1') {
unionIsland(parent, i*y + j, i*y + j + 1);
}
// 如果下边是陆地
if (grid[i][j] == '1' && grid[i+1][j] == '1') {
unionIsland(parent, i*y + j, (i + 1)*y + j);
}
}
}
for (int j=0; j<y-1; ++j) {
if (grid[x-1][j] == '1' && grid[x-1][j+1] == '1') {
unionIsland(parent, (x-1) * y + j, (x-1) * y + j + 1);
}
}
for (int i=0; i<x-1; ++i) {
if (grid[i][y-1] == '1' && grid[i+1][y-1] == '1') {
unionIsland(parent, (i+1)*y - 1, (i+2) * y - 1);
}
}
int res = 0;
for (int i=0; i<x*y; ++i) {
if (parent[i] == i) {
++res;
}
}
return res;
}
void unionIsland(int parent[], int land1, int land2) {
int f = findParent(parent, land1);
parent[findParent(parent, land2)] = f;
}
int findParent(int parent[], int land) {
if (parent[land] != land) return findParent(parent, parent[land]);
else return land;
}
};