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

devtools/2024/10/17 16:04:12/

图论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/devtools/124248.html

相关文章

在三维可视化项目中,B/S和C/S架构该如何选择?

一、什么是B/S和C/S 在3D数据可视化中&#xff0c;有两种常见的架构模式&#xff1a;BS&#xff08;Browser/Server&#xff09;和CS&#xff08;Client/Server&#xff09; B/S模式 B/S模式是指将3D数据可视化的逻辑和处理放在服务器端&#xff0c;而在客户端使用浏览器进行…

激光slam学习笔记5--基于走直线标定RTK与车体旋转外参

背景&#xff1a;车子走直线&#xff0c;可以把RTK标定到车身&#xff0c;之前没有操作过&#xff0c;手推一下公式&#xff0c;发现也挺简单的。 一、证明过程 &#xff08;直接上操作&#xff0c;字错莫怪&#xff0c;嘻嘻&#xff09; 二、进一步解析 1&#xff09;通过…

基于模型的强化学习方法4大类灌水范式

我们都知道基于模型的强化学习&#xff0c;就是从数据中学一个环境模型。 举个例子&#xff0c;我们要控制一个马达&#xff0c;输入就是电流&#xff0c;输出就是转速。无模型强化学习就是随机采样&#xff0c;然后从数据中直接学习输入到输出的影射&#xff0c;研究重心在如…

python 实现boruvka博鲁夫卡算法

boruvka博鲁夫卡算法介绍 Boruvka算法是一种用于生成最小生成树&#xff08;Minimum Spanning Tree&#xff0c;MST&#xff09;的算法。其基本思想和特点如下&#xff1a; 基本思想 Boruvka算法是基于Kruskal算法的一种多路增广算法。在算法执行过程中&#xff0c;它每次从…

C语言贪吃蛇

#只讲逻辑不讲一些基础&#xff0c;基础大概过一遍就行# project-one: 无 (gitee.com)仓库里面有原代码 一、基础工作 1、先将你的编译器换成32位环境&#xff0c;也就是x86&#xff0c; 如果是控制台主机窗口则管&#xff0c;若不是需要改为控制台主机窗口 打开运行窗口后点…

Go语言实现长连接并发框架 - 任务管理器

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们上篇博客实现了路由分组的功能&#xff0c;接下来这篇博客我们将要实现任务管理模块 接口 trait/task_mgr.go type TaskMgr interface {RouterGroupStart()StartWorker(tas…

Frp云服务器与PC机器实现内外网穿透

Frp&#xff08;Fast Reverse Proxy&#xff09;是一个高性能的反向代理应用&#xff0c;它支持TCP、UDP、HTTP、HTTPS等协议&#xff0c;可以帮助实现内网穿透&#xff0c;使得内网的服务可以通过公网进行访问。Frps为服务端、Frpc为客户端。 以下是使用Frp在云服务器上进行内…

LVM——让Linux磁盘空间的弹性管理

什么是LVM&#xff1f; LVM(Logical Volume Manager)逻辑卷管理是在Linux2.4内核以上实现的磁盘管理技术。它是Linux环境下对 磁盘分区进行管理的一种机制。现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制&#xff0c;对于其它的类UNIX操作系统&#xff0c;以及windows操…