中等
相关标签
相关企业
给你一个由 '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.lengthn == grid[i].length1 <= m, n <= 300grid[i][j]的值为'0'或'1'
题解:
bug:主要问题是在dfs函数中,dfs函数中要先看当前坐标是否越界,不越界的话看当前坐标是否值为1,此时才可以进行标记2,并且此时才可以继续探索周围,而不是任意情况都能向四周探索。
#include <stdio.h>
#include <stdlib.h>
void dfs(int** grid, int i, int j, int r, int c)
{
if (i >= 0 && i <= r - 1 && j >= 0 && j <= c - 1 && grid[i][j] == 1)
{
grid[i][j] = 2;
dfs(grid, i + 1, j, r, c);
dfs(grid, i, j + 1, r, c);
dfs(grid, i - 1, j, r, c);
dfs(grid, i, j - 1, r, c);
}
else return;
}
int main()
{
int r, c, i, j, num = 0;
scanf("%d %d", &r, &c);
int** grid = (int**)malloc(sizeof(int*) * r);
for (i = 0;i <= r - 1;i ++)
{
grid[i] = (int*)malloc(sizeof(int) * c);
}
for (i = 0;i <= r - 1;i ++)
{
for (j = 0;j <= c - 1;j ++)
{
scanf("%d", &grid[i][j]);
}
}
for (i = 0;i <= r - 1;i ++)
{
for (j = 0;j <= c - 1;j ++)
{
if (grid[i][j] == 1)
{
dfs(grid, i, j, r, c);
num ++;
}
}
}
printf("%d", num);
return 0;
}