尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Day52_图论3.md

Day52_图论3.md
📅 发布时间:2026/6/19 23:05:09
Day52_图论3.md

孤岛的总面积

题目描述

在由0和1组成的二维数组中,寻找上下左右四个方向都被0包裹的1的总数。
输入:
第1行输入二维数组的行数和列数;
此后输入n*m;

思路:

这道题目一开始想的是先找到岛,其次判断是不是边界上的岛,最后统计孤岛的面积。
如此势必要写岛的四边的判断条件。
题解的思路是:首先排除边上所有的岛,然后对剩余的陆地进行计数。

遇到的问题:

在dfs函数中,首先进行海水化的操作,其次进行边界判断,最后判断是不是陆地。即先进行数组越界判断,然后进行元素判断,不能改变顺序,否则会产生段错误;
在靠边的陆地判断中,坐标容易搞错。

实现

# include<iostream>
# include<vector>
using namespace std;
void dfs(vector<vector<int>> &grid,int x,int y){grid[x][y]=0;int dir[4][2]={0,1,0,-1,1,0,-1,0};for(int i=0;i<4;i++){int nextx=x+dir[i][1];int nexty=y+dir[i][0];if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size()){continue;}if(grid[nextx][nexty]==0){continue; }dfs(grid,nextx,nexty);}
}
int main(){int n,m;cin>>n>>m;vector<vector<int>> grid(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>grid[i][j];}}for(int i=0;i<n;i++){if(grid[i][0]==1)dfs(grid,i,0);if(grid[i][m-1]==1)dfs(grid,i,m-1);}for(int j=0;j<m;j++){if(grid[0][j]==1)dfs(grid,0,j);if(grid[n-1][j]==1)dfs(grid,n-1,j);}int count=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j]==1){count++;}}}cout<<count<<endl;return 0;
}

沉默孤岛

问题描述

将位于中央的所有孤岛变为海水,输出处理后的矩阵。上一道题目是把周围的陆地变成海水,这次是把中间的岛变成海水。

实现

# include<iostream>
# include<vector>
using namespace std;
void dfs(vector<vector<int>> &grid,int x,int y){grid[x][y]=2;int dir[4][2]={0,1,0,-1,1,0,-1,0};for(int i=0;i<4;i++){int nextx=x+dir[i][1];int nexty=y+dir[i][0];if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size()){continue;}if(grid[nextx][nexty]==0||grid[nextx][nexty]==2){continue; }dfs(grid,nextx,nexty);}
}
int main(){int n,m;cin>>n>>m;vector<vector<int>> grid(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>grid[i][j];}}for(int i=0;i<n;i++){if(grid[i][0]==1)dfs(grid,i,0);if(grid[i][m-1]==1)dfs(grid,i,m-1);}for(int j=0;j<m;j++){if(grid[0][j]==1)dfs(grid,0,j);if(grid[n-1][j]==1)dfs(grid,n-1,j);}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j]==1){grid[i][j]=0;}if(grid[i][j]==2){grid[i][j]=1;}}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){cout<<grid[i][j]<<" ";}cout<<endl;
}
}

水流问题

问题描述

给定一个矩阵,输出一些元素的坐标,该坐标满足从某一方向上不递增地大于边界元素值。
如果这个矩阵只有两行或者两列,那么其所有元素都是边界元素,那还需要输出吗?

思路:

先确定外围的,然后向里逼近。
一个元素,只要比它上下左右四个方向上任意一个方向的值大,就可以输出其坐标。
alt text
题目理解有误。图中(3,3)的值是不满足条件的。

#include <iostream>
#include <vector>
using namespace std;
int n, m;
int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};// 从 x,y 出发 把可以走的地方都标记上
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {if (visited[x][y]) return;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 >= n || nexty < 0 || nexty >= m) continue;if (grid[x][y] > grid[nextx][nexty]){continue;} dfs(grid, visited, nextx, nexty);}return;
}int main() {cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<bool>> FirstBound(n, vector<bool>(m, false));vector<vector<bool>> SecondBound(n, vector<bool>(m, false));for(int i=0;i<n;i++){dfs(grid,FirstBound,i,0);dfs(grid,SecondBound,i,m-1);}//左右//vector<vector<bool>> visited(n, vector<bool>(m, false));for(int j=0;j<m;j++){dfs(grid,FirstBound,0,j);dfs(grid,SecondBound,n-1,j);}// 遍历每一个点,看是否能同时到达第一组边界和第二组边界for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (FirstBound[i][j]&&SecondBound[i][j]) {cout << i << " " << j << endl;}}}

最大岛屿

把任何一块水域变成陆地,使得生成的岛屿有最大的面积。

思路

1.对岛屿进行标记; 通过dfs找到岛并记录岛屿的大小,通过一个unordered_map实现岛屿编号和岛屿大小的映射关系。
2.遍历每一格海水,记录最大岛屿面积;如果该格是海水,就把上下左右四面的岛屿总数相加;
为什么需要一个visitedGrid把走过的标记一遍呢?

相关新闻

  • 基于PyTorch-CUDA-v2.6镜像搭建YOLOv11目标检测训练环境
  • Conda install pytorch 总是失败?看看这些避坑指南
  • 第 5 课:Python 高级数据容器与文件操作 —— 数据去重、有序存储与持久化核心

最新新闻

  • 武汉家具安装推荐良匠千艺2026口碑榜 - 我叫一
  • 2026昆山卫生间防水服务商适配指南:昆山鼎壹万机构解析及5家优质服务商推荐 专业瓷砖空鼓维修公司排名推荐(2026年5月瓷砖空鼓维修最新TOP权威排名) - 鼎壹万修缮说
  • 166、模组来料检验标准:外观、MTF 抽检、IRCF 透过率测试的 IQC 流程
  • 马鞍山GEO服务商代理加盟选型靠谱推荐?2026年马鞍山GEO代理服务商选型排名与合作路径解析 - 子柔传媒
  • 大连家电维修平台推荐:本地用户实测较好的几家服务商深度对比——2026年6月最新发布 - 一步到家
  • 3步解锁老旧Mac新生命:OpenCore Legacy Patcher终极升级指南

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号