200. 岛屿数量

35 阅读1分钟

200. 岛屿数量

中等

相关标签

premium lock icon相关企业

给你一个由 '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'

题解:

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;
}