图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积

99. 岛屿数量(深搜版)

题目链接:99. 岛屿数量

题目描述:

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

解题思路:

1、每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

2、遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。

代码:

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
 
int dx[4] = {-1,0,0,1};
int dy[4] = {0,-1,1,0};
void dfs(vector<vector<int>>& matrix, vector<vector<bool>>& island, int r, int c)
{
    for(int i = 0; i < 4; i++)
    {
        int x = r + dx[i];
        int y = c + dy[i];
        if(x < 0 || y < 0 || x >= matrix.size() || y >= matrix[0].size() || matrix[x][y] == 0 || island[x][y]) continue;
        island[x][y] = true;
        dfs(matrix,island,x,y);
    }
}
 
int main()
{
    int n , m;
    cin >> n >> m;
    vector<vector<int>> matrix(n+2,vector<int>(m+2));
    vector<vector<bool>> island(n+2,vector<bool>(m+2));
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> matrix[i][j];
     
    int result = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(matrix[i][j] == 1 && !island[i][j])
            {
                result++;
                island[i][j] = true;
                dfs(matrix,island, i,j);
            }
        }
    }
    cout << result << endl;
    return 0;
}

99. 岛屿数量(广搜版)

解题思路:

1、每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

2、遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。

3、加入队列就代表走过,就需要标记

代码:

cpp 复制代码
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PII;

int dx[4] = {-1,0,0,1};
int dy[4] = {0,-1,1,0};
void bfs(vector<vector<int>>& matrix, vector<vector<bool>>& island, int r, int c)
{
    queue<PII> q;
    q.push({r,c});
    while(!q.empty())
    {
        PII val = q.front();
        q.pop();
        for(int i = 0; i < 4; i ++)
        {
            int x = val.first + dx[i], y = val.second + dy[i];
            if(x < 0 || x >= matrix.size() || y < 0 || y >= matrix[0].size()) continue;
            if(matrix[x][y] == 1 && !island[x][y]) 
            {
                island[x][y] = true;
                q.push({x,y});
            }
        }
    }
}

int main()
{
    int n , m;
    cin >> n >> m;
    vector<vector<int>> matrix(n+2,vector<int>(m+2));
    vector<vector<bool>> island(n+2,vector<bool>(m+2));
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> matrix[i][j];
    
    int result = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(matrix[i][j] == 1 && !island[i][j])
            {
                result++;
                island[i][j] = true;
                bfs(matrix,island, i,j);
            }
        }
    }
    cout << result << endl;
    return 0;
}

100. 岛屿的最大面积

题目链接:100. 岛屿的最大面积

题目描述:

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

解题思路:

上一题的变形,此时计数器统计的是每一个岛屿中1的个数,因此需要放置在dfs中计数

代码:

1)dfs有返回

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};

int dfs(vector<vector<int>>& matrix, vector<vector<int>>& visited, int r, int c)
{
    visited[r][c] = true; // 标记当前点为已访问
    int area = 1; // 当前格子也算一个面积单位
    for(int i = 0; i < 4; i++)
    {
        int x = dx[i] + r, y = dy[i] + c;
        // 边界检查,防止越界
        if(x < 1 || y < 1 || x >= matrix.size()-1 || y >= matrix[0].size()-1) continue;
        if(!visited[x][y] && matrix[x][y] == 1)
        {
            area += dfs(matrix, visited, x, y); // 递归累加面积
        }
    }
    return area;
}

int main()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int>> matrix(n+2, vector<int>(m+2));
    vector<vector<int>> visited(n+2, vector<int>(m+2, 0)); // 初始化为未访问
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> matrix[i][j];
    
    int max_area = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(matrix[i][j] == 1 && !visited[i][j])
            {
                int area = dfs(matrix, visited, i, j); // 计算当前连通区域的面积
                max_area = max(max_area, area); // 更新最大面积
            }
        }
    }
    
    cout << max_area << endl;
    return 0;
}

2)dfs无返回

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int dx[4] = {-1,0, 0, 1};
int dy[4] = {0,-1,1,0};

int cnt;

void dfs(vector<vector<int>>& matrix,vector<vector<int>>& visited, int r , int c)
{
    cnt ++;
    visited[r][c] = true;
    for(int i = 0; i < 4; i++)
    {
        int x = dx[i] + r, y = dy[i] + c;
        if(x < 0 || y < 0 || x >= matrix.size() || y >= matrix[0].size()) continue;
        if(!visited[x][y] && matrix[x][y] == 1)
        {
            dfs(matrix,visited,x,y);
        }
            
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int>> matrix(n+2,vector<int>(m+2));
    vector<vector<int>> visited(n+2,vector<int>(m+2));
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> matrix[i][j];
    
    int area = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(matrix[i][j] == 1 && !visited[i][j])
            {
                cnt  = 0;
                dfs(matrix,visited,i,j);
                area = max(area,cnt);
                
            }
        }
    }
    
    cout << area << endl;
    return 0;
}
相关推荐
纪元A梦3 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
阿让啊4 小时前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
深圳市快瞳科技有限公司4 小时前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle4 小时前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
superlls6 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻7 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
Hello_Embed7 小时前
STM32HAL 快速入门(十九):UART 编程(二)—— 中断方式实现收发及局限分析
笔记·stm32·单片机·嵌入式硬件·学习
纪元A梦7 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
天上的光7 小时前
关于学习的一些感悟
学习
Ripple123128 小时前
数据结构:顺序表与链表
数据结构·链表