代码随想录|图论|07岛屿的最大面积

leetcode:100. 岛屿的最大面积

题目

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。

输出描述

输出一个整数,表示岛屿的最大面积。如果不存在岛屿,则输出 0。

输入示例

4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1

输出示例

4

代码随想录|图论|07岛屿的最大面积_第1张图片

思路

需要计算每一个岛屿群的面积,然后找出最大的。

DFS方法

根据之前的解法,每个dfs处理当前的节点,那么在主函数中岛屿初始计数为0,因为在进入dfs之后,会立马进行增加。

// ======================================DFS第二种写法,处理当前节点======================================
#include 
using namespace std;

int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
// cnt设置的是全局变量,因为在每个dfs之前都需要置0
int cnt = 0;

void dfs(vector> &grid, vector> &visited, int x, int y)
{
    // 终止条件:遇到海水或者已经遍历过的节点
    if (grid[x][y] == 0 || visited[x][y])
    {
        return;
    }
    // 处理当前节点
    cnt++;
    visited[x][y] = true;
    // 当前节点往下延伸,看四周的节点
    for (int i = 0; i < 4; i++)
    {
        int nextx = x + dir[i][0];
        int nexty = y + dir[i][1];
        if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size())
            continue;
        dfs(grid, visited, nextx, nexty);
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    vector> grid(n, vector(m, 0));
    vector> visited(n, vector(m, false));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> grid[i][j];
        }
    }
    // result是最终结果,不断跟我们的最大面积进行比较
    int result = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (!visited[i][j] && grid[i][j] == 1)
                cnt = 0; // dfs处理的是当前节点,所以遇到陆地设为0,进入dfs之后才开始cnt++
            dfs(grid, visited, i, j);
            result = max(result, cnt);
        }
    }
    cout << result << endl;
    return 0;
}

BFS方法

void bfs(vector> &grid, vector> &visited, int x, int y)
{
    queue> q;
    q.push({x, y});
    visited[x][y] = true;   // 只要加入队列就进行标记
    cnt++;
    while (!q.empty())
    {
        pair cur = q.front();
        q.pop();
        int curx = cur.first;
        int cury = cur.second;
        for (int i = 0; i < 4; i++)
        {
            int nextx = curx + dir[i][0];
            int nexty = cury + dir[i][1];
            if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size())
                continue;
            if (grid[nextx][nexty] == 1 && !visited[nextx][nexty])
            {
                q.push({nextx, nexty});
                visited[nextx][nexty] = true;
                cnt++;
            }
        }
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    vector> grid(n, vector(m, 0));
    vector> visited(n, vector(m, false));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> grid[i][j];
        }
    }
    int result = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (grid[i][j] == 1 && !visited[i][j])
            {
                cnt = 0;
                bfs(grid, visited, i, j);
                result = max(result, cnt);
            }
        }
    }
    cout << result << endl;
    return 0;
}

总结

cnt是全局变量,用来统计当前遍历到的岛屿数量,在每次dfs或者bfs之前,都会把它置0.

参考资料

代码随想录

你可能感兴趣的:(算法,深度优先,图论,数据结构,c++)