LeetCode链接:https://leetcode.cn/problems/number-of-islands/description/
给你一个由 '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
解题思路:
1.通过字符二维数组,从左上到右下,找到第一个'1'出现的位置
2.通过该位置,进行深度搜索,将相邻的1清零。
/*
1:通过字符二维数组,从左上到右下,找到第一个‘1’出现的位置
2:通过该位置,进行深度搜索,将相邻的1清零
*/
void dfsCleanLan(char **grid, int maxRow, int maxCol, int row, int col)
{
if (grid[row][col] == '1') {
grid[row][col] = '0';
} else {
/* 周边都被清零了,则退出 */
return;
}
//上
if (col - 1 >= 0 && grid[row][col - 1] == '1') {
dfsCleanLan(grid, maxRow, maxCol, row, col - 1);
}
//下
if (col + 1 < maxCol && grid[row][col + 1] == '1') {
dfsCleanLan(grid, maxRow, maxCol, row, col + 1);
}
//左
if (row - 1 >= 0 && grid[row - 1][col] == '1') {
dfsCleanLan(grid, maxRow, maxCol, row - 1, col);
}
//右
if (row + 1 < maxRow && grid[row + 1][col] == '1') {
dfsCleanLan(grid, maxRow, maxCol, row + 1, col);
}
}
int numIslands(char** grid, int gridSize, int* gridColSize){
int row;
int col;
int maxRow = gridSize;
int maxCol = gridColSize[0];
int count = 0;
for (row = 0; row < maxRow; row++) {
maxCol = gridColSize[row];
for (col = 0; col < maxCol; col++) {
if (grid[row][col] == '1') {
dfsCleanLan(grid, maxRow, maxCol, row, col);
count++;
}
}
}
return count;
}