图论day57|建造最大岛屿(卡码网)【截至目前,图论的最高难度】

server/2024/10/17 18:10:21/

图论day57|建造最大岛屿(卡码网)【截至目前所做的题中,图论的最高难度】

      • 思维导图分析
    • 104.建造最大岛屿(卡码网)【截至目前所做的题中,图论的最高难度】

思维导图分析

在这里插入图片描述

104.建造最大岛屿(卡码网)【截至目前所做的题中,图论的最高难度】

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,你最多可以将矩阵中的一格水变为一块陆地,在执行了此操作之后,矩阵中最大的岛屿面积是多少。

岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿是被水包围,并且通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设矩阵外均被水包围。

输入描述

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

输出描述

输出一个整数,表示最大的岛屿面积。

输入示例

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

输出示例

6

提示信息

img

对于上面的案例,有两个位置可将 0 变成 1,使得岛屿的面积最大,即 6。

img

数据范围:

1 <= M, N <= 50。

#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
using namespace std;int dir[4][2]={1,0,-1,0,0,1,0,-1};
int count;void dfs(vector<vector<int>> &grid,vector<vector<bool>>& visited,int x,int y,int mark)
{if(visited[x][y]==true||grid[x][y]==0)return;visited[x][y]=true;grid[x][y]=mark;count++;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[1].size())continue;dfs(grid,visited,nextx,nexty,mark);}
}int main()
{int n,m;cin>>n>>m;vector<vector<int>> grid(n+1,vector<int>(m+1,0));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>grid[i][j];vector<vector<bool>> visited(n+1,vector<bool>(m+1,false));unordered_map<int,int> map;bool landAll=true;int mark=2;//给岛屿标记并用哈希表存储for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(grid[i][j]==0)landAll=false;if(grid[i][j]==1&&visited[i][j]==false){count=0;bfs(grid,visited,i,j,mark);map[mark]=count;mark++;}}if(landAll){cout<<n*m<<endl;return 0;}unordered_set<int> set;int result=0;//将一块水变成陆地for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(grid[i][j]==0){set.clear();count=1;for(int k=0;k<4;k++){int neari=i+dir[k][0];int nearj=j+dir[k][1];if(neari<=0||neari>=grid.size()||nearj<=0||nearj>=grid[1].size())continue;if(set.find(grid[neari][nearj])!=set.end())continue;count+=map[grid[neari][nearj]];set.insert(grid[neari][nearj]);}result=max(result,count);}}cout<<result<<endl;
}

具体分析过程见思维导图


http://www.ppmy.cn/server/132067.html

相关文章

面对服务器掉包的时刻困扰,如何更好的解决

在数字化时代&#xff0c;服务器的稳定运行是企业业务连续性的基石。然而&#xff0c;服务器“掉包”现象&#xff0c;即数据包在传输过程中丢失或未能正确到达目的地的情况&#xff0c;却时常成为IT运维人员头疼的问题。它不仅影响用户体验&#xff0c;还可能导致数据不一致、…

Wireshark数据包分析教程

Wireshark数据包分析教程 本教程将基于Wireshark工具捕获的数据包&#xff0c;逐步讲解网络数据帧中的各项信息&#xff0c;帮助你了解每个字段的含义及其作用。我们将从最基础的帧&#xff08;Frame&#xff09;信息开始&#xff0c;逐层解释包括以太网、IP、TCP、HTTP和JSON…

AI助手新选择:豆包 MarsCode-免费智能编程新利器

一、MarsCode 初印象 官网介绍&#xff1a;豆包 MarsCode 在科技飞速发展的当下&#xff0c;编程领域也迎来了新的变革。字节跳动推出的豆包 MarsCode 便是这场变革中的一颗璀璨之星。 豆包 MarsCode 的推出背景紧扣时代需求。随着人工智能的不断发展&#xff0c;编程工作也需…

一文搞定PID!嵌入式STM32-PID位置环和速度环_stm32 pid

在嵌入式系统开发中&#xff0c;PID控制器因其简单有效而被广泛应用。本文将详细介绍如何在STM32微控制器上实现PID控制&#xff0c;包括位置环和速度环的PID算法及其代码实现。 PID基础知识 PID控制器由比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分…

专题1:方向导数与梯度

一、回忆偏导数 多元函数&#xff08;比如有x、y两个变量&#xff09;在某个点有两个偏导数&#xff0c;一个是关于x的偏导数&#xff0c;一个是关于y的偏导数。如下所示&#xff1a; 所谓偏导数&#xff0c;其实就是某点处函数在x的正方向或y的正方向上的变化率。从图像上来看…

使用JVM分析服务性能问题

在Java应用开发和运维过程中&#xff0c;性能问题往往是一个重要的挑战。而Java虚拟机&#xff08;JVM&#xff09;作为Java应用的运行环境&#xff0c;其性能调优对于提升应用性能至关重要。本文将详细介绍如何使用JVM工具分析服务性能问题&#xff0c;并通过实战示例展示具体…

《Image Processing GNN: Breaking Rigidity in Super-Resolution》CVPR2024

摘要 这篇论文提出了一种名为Image Processing Graph Neural Networks (IPG) 的模型&#xff0c;旨在通过利用图的灵活性来突破超分辨率&#xff08;Super-Resolution, SR&#xff09;中的固有刚性问题。在现有的SR模型中&#xff0c;无论是基于卷积神经网络&#xff08;CNNs&…

异配图对比学习24整理

数据集介绍&#xff1a; 大类数据集名称pyg‘cora’ &#xff0c;‘citeseer’ &#xff0c;‘pubmed’&#xff0c;‘cornell’&#xff0c;‘texas’&#xff0c;wisconsin’,flickr,reddit,actoryandexchameleon_filtered, squirrel_filtered, roman_empire, amazon_rating…