中等
相关标签
相关企业
给你一个由 '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函数中,if (grid[r][c] != 1 || r < 0 || r > row - 1 || c < 0 || c > column - 1) { return; }应该先判断越界再判断是否为1,先后顺序不能乱。修改后函数能正常输出了,原来是自己会自动退出,但是也不报错,很恶心,if(),while(),这里面的判断多个的顺序一定要注意区分。
#include <stdio.h>
#include <stdlib.h>
void dfs(int** grid, int r, int c, int row, int column)
{
if (r < 0 || r > row - 1 || c < 0 || c > column - 1 || grid[r][c] != 1 )
{
return;
}
grid[r][c] = 2;
dfs(grid, r + 1, c, row, column);
dfs(grid, r, c + 1, row, column);
dfs(grid, r - 1, c, row, column);
dfs(grid, r, c - 1, row, column);
}
int main()
{
int row, column, i, j, ans = 0;
printf("row column:");
scanf("%d %d", &row, &column);
int** grid = (int**)malloc(sizeof(int*) * row);
for (i = 0;i <= row - 1;i ++)
{
grid[i] = (int*)malloc(sizeof(int) * column);
}
for (i = 0;i <= row - 1;i ++)
{
for (j = 0;j <= column - 1;j ++)
{
scanf("%d", &grid[i][j]);
}
}
for (i = 0; i <= row - 1;i ++)
{
for (j = 0;j <= column - 1;j ++)
{
if (grid[i][j] == 1)
{
dfs(grid, i, j, row, column);
ans ++;
}
}
}
printf("\n%d", ans);
return 0;
}