笔记:代码随想录算法训练营day58:101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
学习资料:代码随想录
文中含大模型生成内容
101. 孤岛的总面积
卡码网:101. 孤岛的总面积
所以找周边都是水的陆地的方法就是找边缘的陆地然后删除它连同它的连通的陆地
深搜
#include <iostream>
#include <vector>
using namespace std;int dir[4][2]={0,1,-1,0,0,-1,1,0};void dfs(vector<vector<int>>& fiji,int x,int y){fiji[x][y]=0;for(int i=0;i<4;i++){int xnext=x+dir[i][0];int ynext=y+dir[i][1];if(xnext<0||xnext>=fiji.size()||ynext<0||ynext>=fiji[0].size()) continue;if(fiji[xnext][ynext]==0)continue;else{dfs(fiji,xnext,ynext);}}
}
int main(){int n,m;cin>>n>>m;vector<vector<int>> fiji(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>fiji[i][j];}}for(int i=0;i<n;i++){if(fiji[i][0]==1){dfs(fiji,i,0);}if(fiji[i][m-1]==1){dfs(fiji,i,m-1);}}for(int j=0;j<m;j++){if(fiji[0][j]==1){dfs(fiji,0,j);}if(fiji[n-1][j]==1){dfs(fiji,n-1,j);}}int count =0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(fiji[i][j]==1) count++;}}cout<<count<<endl;
}
广搜
#include <iostream>
#include <vector>
#include <queue>
using namespace std;int dir[4][2]={0,1,-1,0,0,-1,1,0};void bfs(vector<vector<int>>& fiji,int x,int y){fiji[x][y]=0;queue<pair<int,int>> que;que.push({x,y});while(!que.empty()){pair<int,int> cur=que.front();que.pop();for(int i=0;i<4;i++){int xnext = cur.first+dir[i][0];int ynext = cur.second+dir[i][1];if(xnext<0||xnext>=fiji.size()||ynext<0||ynext>=fiji[0].size()) continue;if(fiji[xnext][ynext]==1){que.push({xnext,ynext});fiji[xnext][ynext]=0;}}}
}
int main(){int n,m;cin>>n>>m;vector<vector<int>> fiji(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>fiji[i][j];}}for(int i=0;i<n;i++){if(fiji[i][0]==1){bfs(fiji,i,0);}if(fiji[i][m-1]==1){bfs(fiji,i,m-1);}}for(int j=0;j<m;j++){if(fiji[0][j]==1){bfs(fiji,0,j);}if(fiji[n-1][j]==1){bfs(fiji,n-1,j);}}int count =0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(fiji[i][j]==1) count++;}}cout<<count<<endl;
}
在 深度优先搜索(DFS)或广度优先搜索(BFS) 中,我们通常用 visited 数组来标记已经访问过的点,以防止:
- 重复访问,导致超时
- 无限递归,导致栈溢出(Stack Overflow)
通常如果 不能修改原数组,我们就要 额外开一个 visited 数组 来记录访问情况。
这里的 grid 只有两种值:
1(陆地)0(海洋)
我们遍历 grid 时:
-
遇到
1(陆地):- 说明它是未访问过的,然后我们调用
dfs(grid, x, y)。 - 在 DFS 里,我们把
grid[x][y]直接改成0,代表这个点已经被访问过了。 - 这样,我们就不会 重复访问 这个点,也不会影响后续的 DFS 逻辑。
- 说明它是未访问过的,然后我们调用
-
遇到
0(海洋):- 要么是原始的海洋
- 要么是 DFS 过程中被修改成
0的陆地 - 不需要再访问,所以直接跳过
-
这样,我们实际上是用
grid自己充当visited数组!
102. 沉没孤岛
卡码网题目链接(ACM模式)
先把边缘的陆地标记成2,然后把陆地1改成水0,最后把边缘的陆地改回1就可以了
深搜
#include <iostream>
#include <vector>
using namespace std;int dir[4][2]={0,1,-1,0,0,-1,1,0};
void dfs(vector<vector<int>>& fiji,int x,int y){fiji[x][y]=2;for(int i=0;i<4;i++){int xnext = x+dir[i][0];int ynext = y+dir[i][1];if(xnext<0||xnext>=fiji.size()||ynext<0||ynext>=fiji[0].size()) continue;if(fiji[xnext][ynext]==1){dfs(fiji,xnext,ynext);}}
}
int main(){int n,m;cin>>n>>m;vector<vector<int>> fiji(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>fiji[i][j];}}for(int i=0;i<n;i++){if(fiji[i][0]==1) dfs(fiji,i,0);if(fiji[i][m-1]==1) dfs(fiji,i,m-1);}for(int j=0;j<m;j++){if(fiji[0][j]==1) dfs(fiji,0,j);if(fiji[n-1][j]==1) dfs(fiji,n-1,j);}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(fiji[i][j]==2){fiji[i][j]=1;}else if(fiji[i][j]==1){fiji[i][j]=0;}cout<<fiji[i][j]<<' ';}cout<<endl;}}
广搜
#include <iostream>
#include <vector>
#include <queue>
using namespace std;int dir[4][2]={0,1,-1,0,0,-1,1,0};
void dfs(vector<vector<int>>& fiji,int x,int y){queue<pair<int,int>> que;que.push({x,y});fiji[x][y]=2;while(!que.empty()){pair<int,int> cur=que.front();que.pop();for(int i=0;i<4;i++){int xnext = cur.first+dir[i][0];int ynext = cur.second+dir[i][1];if(xnext<0||xnext>=fiji.size()||ynext<0||ynext>=fiji[0].size()) continue;if(fiji[xnext][ynext]==1){que.push({xnext,ynext});fiji[xnext][ynext]=2;}}}
}
int main(){int n,m;cin>>n>>m;vector<vector<int>> fiji(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>fiji[i][j];}}for(int i=0;i<n;i++){if(fiji[i][0]==1) dfs(fiji,i,0);if(fiji[i][m-1]==1) dfs(fiji,i,m-1);}for(int j=0;j<m;j++){if(fiji[0][j]==1) dfs(fiji,0,j);if(fiji[n-1][j]==1) dfs(fiji,n-1,j);}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(fiji[i][j]==2){fiji[i][j]=1;}else if(fiji[i][j]==1){fiji[i][j]=0;}cout<<fiji[i][j]<<' ';}cout<<endl;}}
103. 水流问题
卡码网题目链接(ACM模式)
从边缘向中间搜索高点并记录
#include <iostream>
#include <vector>
using namespace std;
int dir[4][2]={0,1,-1,0,0,-1,1,0};void dfs(vector<vector<bool>>& visited,const vector<vector<int>>& fiji,int x,int y){if(visited[x][y]==true) return;visited[x][y] =true;for(int i=0;i<4;i++){int xnext = x+dir[i][0];int ynext = y+dir[i][1];if(xnext<0||xnext>=fiji.size()||ynext<0||ynext>=fiji[0].size()) continue;if(visited[xnext][ynext]==false&&fiji[x][y]<=fiji[xnext][ynext]){dfs(visited,fiji,xnext,ynext);}}}
int main(){int n,m;cin>>n>>m;vector<vector<int>> fiji(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>fiji[i][j];}}vector<vector<bool>> firstBorder(n,vector<bool>(m,0));vector<vector<bool>> secondBorder(n,vector<bool>(m,0)); for(int i=0;i<n;i++){dfs(firstBorder,fiji,i,0);dfs(secondBorder,fiji,i,m-1);} for(int j=0;j<m;j++){dfs(firstBorder,fiji,0,j);dfs(secondBorder,fiji,n-1,j);}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(firstBorder[i][j]&&secondBorder[i][j]){cout<<i<<' '<<j<<endl;}}}
}
一点小思考:第一种写法可否把visited改成全局变量然后时间复杂度也变成n*m?还是从两边往中间走合适,要不然使用全局visited并且还是用第一种方法遍历每一个点的话,遇到{{{2,2,2},{2,1,2}{2,2,2}},岂不是中间这个1也会被标记成true,这里是自己的思考,欢迎批评指正
104.建造最大岛屿
卡码网题目链接(ACM模式)
需要先遍历一遍给每块岛一个序号,记录数量,然后去搜索水域加上周围的岛,取最大值,
其中,岛的序号和面积用unordered_map记录
有一个有趣的一点是水周围的陆地可能是连在一起的,所以也要加上后就记录一下,用unordered_set记录
#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
using namespace std;int dir[4][2]={0,1,-1,0,0,-1,1,0};void dfs(vector<vector<int>>& fiji,vector<vector<bool>>& visited,int x,int y,int& mark,int& count){if(visited[x][y]==true) return;fiji[x][y]=mark;visited[x][y]=true;count++;for(int i=0;i<4;i++){int xnext = x+dir[i][0];int ynext = y+dir[i][1];if(xnext<0||xnext>=fiji.size()||ynext<0||ynext>=fiji[0].size()) continue;if(fiji[xnext][ynext]==0) continue;if(visited[xnext][ynext]==false&&fiji[xnext][ynext]==1){dfs(fiji,visited,xnext,ynext,mark,count);}}
}
int main(){int n,m;cin>>n>>m;vector<vector<int>> fiji(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>fiji[i][j];}}vector<vector<bool>> visited(n,vector<bool>(m,0));int mark=2;bool isLand = true;unordered_map<int,int> map;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(fiji[i][j]==0) isLand=false;if(fiji[i][j]==1&&visited[i][j]==false){int count=0;dfs(fiji,visited,i,j,mark,count);map[mark]=count;mark++;}}}if(isLand==true){cout<<n*m;return 0;}int result =0;int area=0;unordered_set<int> addedArea;for(int i=0;i<n;i++){for(int j=0;j<m;j++){addedArea.clear();if(fiji[i][j]==0){area = 0;for(int k=0;k<4;k++){int inext=dir[k][0]+i;int jnext=dir[k][1]+j;if(inext<0||inext>=fiji.size()||jnext<0||jnext>=fiji[0].size()) continue;if(addedArea.count(fiji[inext][jnext])!=0) continue;area+=map[fiji[inext][jnext]];addedArea.insert(fiji[inext][jnext]);}}result=max(area,result);}}cout<<result+1<<endl;
}
.
相关文章:
笔记:代码随想录算法训练营day58:101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
学习资料:代码随想录 文中含大模型生成内容 101. 孤岛的总面积 卡码网:101. 孤岛的总面积 所以找周边都是水的陆地的方法就是找边缘的陆地然后删除它连同它的连通的陆地 深搜 #include <iostream> #include <vector> using namespac…...
5.0 VisionPro调用USB相机的方法与步骤说明(一)
本文介绍如何在C#中调用visionPro以处理USB相机采集到的图片。示例如下: 主要思路如下: 1. 使用AForge来打开以及采集usb相机照片。 usb相机处于一直运行状态。每隔100ms采集一次照片。且触发一次事件。 public void Start() { this.videoSourcePlayer.Stop(); …...
微信小程序计算属性与监听器:miniprogram-computed
小程序框架没有提供计算属性相关的 api ,但是官方为开发者提供了拓展工具库 miniprogram-computed。 该工具库提供了两个功能: 计算属性 computed监听器 watch 一、安装 miniprogram-computed 在项目的根目录下,使用如下命令,…...
强大的AI网站推荐(第二集)—— V0.dev
网站:V0.dev 号称:前端开发神器,专为开发人员和设计师设计,能够使用 AI 生成 React 代码 博主评价:生成的UI效果太强大了,适合需要快速创建UI原型的设计师和开发者 推荐指数:🌟&…...
整理和总结微信小程序的高频知识点
前言 近期萌生了一些想法,感觉可以做一个小程序作为产出。 但小程序做得比较少,因此边做边复习。整理和总结了一些高频知识点和大家一起分享。 一、模板和组件 1.1模板(Template) 优势 简单灵活:模板定义和使用都较…...
vue中js简单创建一个事件中心/中间件/eventBus
vue中js简单创建一个事件中心/中间件/eventBus 目录结构如下: eventBus.js class eventBus {constructor() {this.events {};}// 监听事件on(event, callback) {if (!this.events[event]) {this.events[event] [];}this.events[event].push(callback);}// 发射…...
01. Linux嵌入式系统学习笔记(一)
一. linux基础操作指令 1. 新建文件和目录 (1) 新建文件 touch 命令:用于创建空文件。 touch filename.txt 如果文件已存在,touch 会更新文件的访问时间和修改时间。 (2) 新建目录 mkdir 命令:用于创建目录。 mkdir directoryname 使…...
【从零开始学习计算机科学】软件测试(十)嵌入式系统测试、游戏开发与测试过程、移动应用软件测试 与 云应用软件测试
【从零开始学习计算机科学】软件测试(十)嵌入式系统测试、游戏开发与测试过程、移动应用软件测试 与 云应用软件测试 嵌入式系统测试测试策略及测试流程嵌入式软件测试问题及测试方法嵌入式软件的测试流程游戏开发与测试过程游戏开发与通用软件的开发过程区别游戏测试主要内容…...
# [RPA] 使用八爪鱼进行高效网页数据采集
在许多行业中,数据是核心资产。然而,虽然许多网站的文本内容可以免费访问,但手动一条一条采集,不仅耗时耗力,还容易出错。这种情况下,使用自动化工具来提高采集效率就显得尤为重要。本文将介绍 八爪鱼 这一…...
K8S学习之基础三十七:prometheus监控node资源
Prometheus v2.2.1 编写yaml文件,包含创建ns、configmap、deployment、service # 创建monitoring空间 vi prometheus-ns.yaml apiVersion: v1 kind: Namespace metadata:name: monitor-sa# 创建SA并绑定权限 kubectl create serviceaccount monitor -n monito…...
#mapreduce打包#maven:could not resolve dependencies for project
打包报错: #报错信息: [ERROR] Failed to execute goal on project mapreduce_teacher1: Could not resolve dependencies for project org.example:mapreduce_teacher1:jar:1.0-SNAPSHOT: Failed to collect dependencies at org.apache.hive:hive-exe…...
QT软件匠心开发,塑造卓越设计服务
在当今这个数字化飞速发展的时代,软件已经成为我们生活中不可或缺的一部分。而QT,作为一款跨平台的C图形用户界面应用程序开发框架,凭借其强大的功能和灵活性,在众多软件开发工具中脱颖而出。我们深知,在软件开发领域&…...
田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)
田间机器人幼苗视觉检测与护苗施肥装置研究 基于多光谱视觉与精准施肥的农业机器人系统设计 第一章 绪论 1.1 研究背景与意义 农业智能化需求: 传统幼苗检测依赖人工,效率低且易遗漏弱苗/病苗施肥不精准导致资源浪费和环境污染 技术挑战:…...
生物化学笔记:医学免疫学原理 免疫系统的组成与功能+克隆选择学说
免疫系统的组成与功能 克隆选择学说 克隆选择学说(Clonal Selection Theory)是免疫学的核心理论之一,由 麦克法兰伯内特(Frank Macfarlane Burnet) 在 1957 年提出,用于解释特异性免疫反应的机制。 基本概…...
Android 15 获取网络切片信息的标准接口
相关术语 简称全称中文说明URSPUE Route Selection Policy用户路由选择策略URSP 是 5G 核心网(PCF)下发给 UE 的策略,用于指导应用流量如何路由到不同的网络切片或 PDU 会话。其包含多个规则,每条规则由 优先级、业务描述符(Traffic Descriptor) 和 路由选择描述符(Rout…...
MySql创建分区表并且按月分区
前言 在mysql中,按月份分区,再使用分区字段时间来查询数据将会很快,因为这样只需要扫描指定的分区。因此,在处理大量数据时,使用分区表是一个非常好的选择。 1、创建表,并使用RANGE COLUMNS分区 按创建时间…...
招聘面试季--一文顿悟,Java中字节流和字符流的区别及使用场景上的差异
一、核心区别 特性字节流字符流数据单位以字节(8-bit)为单位处理数据(如0xA1)以字符(16-bit Unicode)为单位处理数据(如A, 你)基类InputStream / OutputSt…...
使用【docker】+【shell】脚本半自动化部署微服务项目
一.前言 以下是一个基于 Docker Shell脚本 的半自动化部署方案,包含镜像构建、容器管理、网络配置和日志监控等核心功能,适用于大多数Web应用或微服务项目。 二.目录结构 三.脚本代码实现 1.Shell脚本实现 (deploy.sh) #!/bin/bash# 设置颜…...
uni-app——计时器和界面交互API
API 基本概要 概念说明 API(应用程序接口)是预先定义的方法集合,用于实现特定功能。在 uni-app 中,通过全局对象 uni 调用 API,例如 uni.getSystemInfoSync 获取设备信息。 API 分类与调用规则 事件监听型 以 on 开…...
使用 GitHub 可重用工作流和 GitHub Actions 简化 DevOps
在当今的 DevOps 环境中,自动化是开发团队能够更快地交付功能并维护高质量代码库的关键。这就是像 GitHub Actions 这样的工具变得不可或缺的地方,因为它能够直接在存储库中自动化、自定义和执行 GitHub 工作流程。 当然,随着项目的规模和存…...
深入理解MySQL日志机制
目录 1. MySQL日志概述 2. 错误日志(Error Log) 2.1 错误日志的作用 2.2 错误日志的配置 2.3 查看错误日志 3. 二进制日志(Binary Log) 3.1 二进制日志的作用 3.2 二进制日志的配置 3.3 查看二进制日志 3.4 二进制日志的…...
Sql Server 索引性能优化 分析以及分表
定位需优化语句 根据工具 skywking 或者开启慢查询日志 找到 慢sql 的语句根据 执行过程 来 判断 慢的原因 row filter 指标 看查了多少数据 比例多少 type 看下是单表 还是 join联表 比如 执行步骤多 没索引 优化方向 减少执行次数索引 没索引考虑加索引 加索引 尽量选择 i…...
vue使用element-ui自定义样式思路分享【实操】
前言 在使用第三方组件时,有时候组件提供的默认样式不满足我们的实际需求,需要对默认样式进行调整,这就需要用到样式穿透。本篇文章以vue3使用element-ui的Tabs组件,对Tabs组件的添加按钮样式进行客制化为例。 确定需要修改的组…...
2020年全国职业院校技能大赛改革试点赛高职组“云计算”竞赛赛卷第二场次题目:容器云平台部署与运维
2020年全国职业院校技能大赛改革试点赛高职组 “云计算”竞赛赛卷 第二场次题目:容器云平台部署与运维 说明:本任务提供有2台服务器master和node,都安装了centos7.5操作系统,在/opt/centos目录下有CentOS-7-x86_64-DVD-1804系统光盘文件所有文件,在/opt/containerk8s目…...
PowerBI 条形图,解决数据标签在条形内部看不清的问题
比如下面的条形图: 最上面两行,数据标签显示在了条形内部,哪怕设置了值为黑色 字体也会自动切换为白色,如果设计要求条形的颜色是浅色,就会导致数据看不清晰。 解决方法一: 将数据标签位置设置为端外 效果…...
下载与快速上手 NVM:Node.js 版本管理工具
一、准备工作:卸载旧版 Node.js 重要提示:在安装 NVM 前,请先彻底删除已安装的 Node.js,避免路径冲突: 检查安装路径 bash where node常见路径: C:\Program Files\nodejs\C:\Users\用户名\AppData\Local\n…...
网络防火墙(Firewall)、Web防火墙(WAF)、入侵检测系统(IDS)、入侵防御系统(IPS)对比总结
目录 一、Firewall、WAF、IDS、IPS四种设备简介 二、Firewall、WAF、IDS、IPS四种设备的角色定位 三、防火墙(Firewall)与入侵检测系统(IPS)的区别 四、入侵检测系统(IDS)与入侵防御系统(IP…...
Unity | 游戏数据配置
目录 一、ScriptableObject 1.创建ScriptableObject 2.创建asset资源 3.asset资源的读取与保存 二、Excel转JSON 1.Excel格式 2.导表工具 (1)处理A格式Excel (2)处理B格式Excel 三、解析Json文件 1.读取test.json文件 四、相关插件 在游戏开发中,策划…...
IT工具 | node.js 进程管理工具 PM2 大升级!支持 Bun.js
P(rocess)M(anager)2 是一个 node.js 下的进程管理器,内置负载均衡,支持应用自动重启,常用于生产环境运行 node.js 应用,非常好用👍 🌼概述 2025-03-15日,PM2发布最新版本v6.0.5,这…...
VulnHub-Web-Machine-N7通关攻略
一、信息收集 第一步:确定靶机IP为192.168.0.107 第二步:扫描后台及开放端口 第三步:进行敏感目录及文件扫描 http://192.168.0.107/index.html (CODE:200|SIZE:1620) http://192.168.0.107/server-status (CODE:403|SIZ…...
