当前位置: 首页 > news >正文

代码随想录训练营Day 66|卡码网101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

1.孤岛的总面积

101. 孤岛的总面积 | 代码随想录

代码:(bfs广搜)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int count;
void bfs(vector<vector<int>>&grid,int x,int y){queue<pair<int,int>> que;que.push({x,y});grid[x][y] = 0; // 这里用grid的元素变为0来进行标记count++;while(!que.empty()){pair<int,int> cur = que.front();que.pop();int curx = cur.first;int cury = cur.second;for(int i = 0; i < 4; i++){int nextx = curx + dir[i][0];int nexty = cury + dir[i][1];if(nextx < 0||nextx >= grid.size()||nexty < 0 ||nexty >= grid[0].size()){continue;}if(grid[nextx][nexty] == 1){que.push({nextx,nexty});grid[nextx][nexty] = 0;count++;}}}
}
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) bfs(grid,i,0);if(grid[i][m - 1] == 1) bfs(grid,i,m - 1);}for(int j = 0; j < m; j++){if(grid[0][j] == 1) bfs(grid,0,j);if(grid[n - 1][j] == 1) bfs(grid,n - 1,j);}count = 0;for(int i = 1; i < n - 1; i++){for(int j = 1; j < m - 1; j++){if(grid[i][j] == 1) bfs(grid,i,j);}}// 输出cout << count << endl;
}

思路:基础题型,这次直接在grid表上进行标记。先把靠近陆地的岛屿都标为0。将用于统计面积的变量的count置为0。接下来就可以排除临近陆地的岛屿,只统计孤岛的数量了。 

易错点:我又犯错了。先是忘记写命名空间了,然后又是在if判断里二维数组我只写了一个下标,最后是找边界找错了,我的循环变量i是在变的,我只要固定另一个下标为临界值就好了。不知道为什么我把i放到了边界的运算里(。。脑子糊了)

代码:(dfs 深搜)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int count;
void bfs(vector<vector<int>>&grid,int x,int y){if(grid[x][y] == 0){return;}grid[x][y] = 0;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[0].size()){continue;}bfs(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) bfs(grid,i,0);if(grid[i][m - 1] == 1) bfs(grid,i,m - 1);}for(int j = 0; j < m; j++){if(grid[0][j] == 1) bfs(grid,0,j);if(grid[n - 1][j] == 1) bfs(grid,n - 1,j);}count = 0;for(int i = 1; i < n - 1; i++){for(int j = 1; j < m - 1; j++){if(grid[i][j] == 1) bfs(grid,i,j);}}// 输出cout << count << endl;
}

 思路:我的博客快做成个人错误大赏了。。。

这次的错误是 在进行下标是否非法的判断的时候,我又写错了。一定要注意边界条件啊,以后检查的时候就应该找这种判断语句好好看看。

2.沉没孤岛 

102. 沉没孤岛 | 代码随想录

代码:(深搜dfs)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int count;
void bfs(vector<vector<int>>&grid,int x,int y){if(grid[x][y] == 2||grid[x][y] == 0){return;}grid[x][y] = 2;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[0].size()){continue;}bfs(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];}}// 处理// 将临近陆地的标为2 和 孤岛区分开vector<vector<bool>> visited(n,vector<bool>(m,false));for(int i = 0; i < n; i++){if(grid[i][0] == 1) bfs(grid,i,0);if(grid[i][m - 1] == 1) bfs(grid,i,m - 1);}for(int j = 0; j < m; j++){if(grid[0][j] == 1) bfs(grid,0,j);if(grid[n - 1][j] == 1) bfs(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;}
}

思路:这里比较巧妙的就是因为临近陆地的岛屿比较好判断,所以将其标记为2,只要与孤岛区别开就好了。接下来,就是把1变为0,把2变为1,输出就好了 

3.水流问题

103. 水流问题 | 代码随想录

代码: (深搜dfs)

#include <iostream>
#include <vector>
using namespace std;
int dir[4][2] = {0,1,1,0,0,-1,-1,0};
void dfs(const 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][4];if(nextx < 0||nextx >= grid.size()||nexty < 0||nexty >= grid[0].size()){continue;}// 必须从低到高if(grid[nextx][nexty] < grid[x][y]) continue;dfs(grid,visited,nextx,nexty);}return;
}
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];}}// 处理vector<vector<bool>> firstBorder(n,vector<bool>(m,false));vector<vector<bool>> secondBorder(n,vector<bool>(m,false));for(int i = 0; i < n; i++){dfs(grid,firstBorder,i,0);dfs(grid,secondBorderBorder,i,m - 1);}for(int j = 0; j < m; j++){dfs(grid,firstBorder,0,j);dfs(grid,secondBorder,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;}}}
}

 思路:这道题的优化很巧妙,因为从边界出发好判断,所以直接从边界出发,把边界可以到达的地方而且是递增的单元进行标记。上边界和下边界各用一套标记,当一个单元被标记两次时,就说明它时满足题意的。

易错点:我自己写了半天,忘记写最重要的 if(grid[nextx][nexty] < grid[x][y]) continue;了。

4.建造最大岛屿 

 104.建造最大岛屿 | 代码随想录

代码: 

#include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map>
using namespace std;
int count;
int dir[4][2] = {0,1,1,0,0,-1,-1,0};
void dfs(vector<vector<int>>&grid,vector<vector<bool>>&visited,int x,int y,int mark){if(visited[x][y]||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[0].size()){continue;}dfs(grid,visited,nextx,nexty,mark);}return;
}
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];}}// 处理vector<vector<bool>> visited(n,vector<bool>(m,false));unordered_map<int,int> gridNum;int mark = 2; // 记录岛屿的编号bool isAllGrid = true; // 记录整个地图是否都是陆地(如果是,就没法添加陆地了)for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(grid[i][j] == 0) isAllGrid = false;if(!visited[i][j] && grid[i][j] == 1){count = 0;dfs(grid,visited,i,j,mark);gridNum[mark] = count; // 记录每一个岛屿的面积mark++;}}}if(isAllGrid == true) {cout << n*m << endl;return 0;}// 根据所填陆地,计算周边岛屿面积之和int result = 0;unordered_set<int> visitedGrid; // 标记访问过的岛屿for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){count = 1; // 记录连接后的岛屿数量visitedGrid.clear();if(grid[i][j] == 0){for(int k = 0; k < 4; k++){int nexti = i + dir[k][0];int nextj = j + dir[k][1];if(nexti < 0||nexti >= grid.size()||nextj < 0||nextj >= grid[0].size()){continue;}if(visitedGrid.count(grid[nexti][nextj])) continue; // 添加过的岛屿不要重复添加count += gridNum[grid[nexti][nextj]];visitedGrid.insert(grid[nexti][nextj]);}}result = max(result,count);}}cout << result << endl;
}

思路:这道题是先计算各个岛屿的面积,然后遍历每一块海域,将这块添加的单元与其临近的岛屿面积进行相加求和,保存里面的最大值。

这道题真的是错死我了。。。这个涉及到很多细节,比如要考虑全是陆地的情况,要将每个岛屿进行面积和标号的映射,要在计算连接后的总面积的时候,将统计过的岛屿进行标记。。。我真的,太痛了。

相关文章:

代码随想录训练营Day 66|卡码网101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

1.孤岛的总面积 101. 孤岛的总面积 | 代码随想录 代码&#xff1a;(bfs广搜) #include <iostream> #include <vector> #include <queue> using namespace std; int dir[4][2] {1,0,0,1,-1,0,0,-1}; int count; void bfs(vector<vector<int>>&a…...

根据状态转移写状态机-二段式

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 描述 题目描述&#xff1a; 如图所示为两种状态机中的一种&#xff0c;请根据状态转移图写出代码&#xff0c;状态转移线上的0/0等表示的意思是过程中data/flag的值。 要求&#xff1a; 1、 必须使用对应类型的状…...

PyTorch C++扩展用于AMD GPU

PyTorch C Extension on AMD GPU — ROCm Blogs 本文演示了如何使用PyTorch C扩展&#xff0c;并通过示例讨论了它相对于常规PyTorch模块的优势。实验在AMD GPU和ROCm 5.7.0软件上进行。有关支持的GPU和操作系统的更多信息&#xff0c;请参阅系统要求&#xff08;Linux&#xf…...

Hadoop archive

Index of /dist/hadoop/commonhttps://archive.apache.org/dist/hadoop/common/...

R语言——R语言基础

1、用repeat、for、while计算从1-10的所有整数的平方和 2、编写一个函数&#xff0c;给出两个正整数&#xff0c;计算他们的最小公倍数 3、编写一个函数&#xff0c;让用户输入姓名、年龄&#xff0c;得出他明年的年龄。用paste打印出来。例如&#xff1a;"Hi xiaoming …...

VFB电压反馈和CFB电流反馈运算放大器(运放)选择指南

VFB电压反馈和CFB电流反馈运算放大器(运放)选择指南 电流反馈和电压反馈具有不同的应用优势。在很多应用中&#xff0c;CFB和VFB的差异并不明显。当今的许多高速CFB和VFB放大器在性能上不相上下&#xff0c;但各有其优缺点。本指南将考察与这两种拓扑结构相关的重要考虑因素。…...

elasticsearch安装(centos7)

先给出网址 elasticsearch&#xff1a;Download Elasticsearch | Elastic elasticKibana&#xff1a;Download Kibana Free | Get Started Now | Elastic Logstash&#xff1a;Download Logstash Free | Get Started Now | Elastic ik分词&#xff1a;Releases infinilabs/…...

Java高手的30k之路|面试宝典|精通JVM(二)

JVM基本结构 类加载子系统&#xff1a;负责将.class文件加载到内存中&#xff0c;并进行验证、准备、解析和初始化。运行时数据区&#xff1a;包括堆&#xff08;Heap&#xff09;、方法区&#xff08;Method Area&#xff09;、Java栈&#xff08;Java Stack&#xff09;、本…...

JVM专题六:JVM的内存模型

前面我们通过Java是如何编译、JVM的类加载机制、JVM类加载器与双亲委派机制等内容了解到了如何从我们编写的一个.Java 文件最终加载到JVM里的&#xff0c;今天我们就来剖析一下这个Java的‘中介平台’JVM里面到底长成啥样。 JVM的内存区域划分 Java虚拟机&#xff08;JVM&…...

学习java第一百零七天

解释JDBC抽象和DAO模块 使用JDBC抽象和DAO模块&#xff0c;我们可以确保保持数据库代码的整洁和简单&#xff0c;并避免数据库资源关闭而导致的问题。它在多个数据库服务器给出的异常之上提供了一层统一的异常。它还利用Spring的AOP模块为Spring应用程序中的对象提供事务管理服…...

k8s上尝试滚动更新和回滚

滚动更新和回滚 实验目标&#xff1a; 学习如何进行应用的滚动更新和回滚操作。 实验步骤&#xff1a; 创建一个 Deployment。更新 Deployment 的镜像版本&#xff0c;观察滚动更新过程。回滚到之前的版本&#xff0c;验证回滚操作。 今天呢&#xff0c;我们继续来进行我们k…...

GitHub Copilot 登录账号激活,已经在IntellJ IDEA使用

GitHub Copilot 想必大家都是熟悉的&#xff0c;一款AI代码辅助神器&#xff0c;相信对编程界的诸位并不陌生。 今日特此分享一项便捷的工具&#xff0c;助您轻松激活GitHub Copilot&#xff0c;尽享智能编码之便利&#xff01; GitHub Copilot 是由 GitHub 和 OpenAI 共同开…...

进程知识点(二)

文章目录 一、进程关系&#xff1f;二、孤儿态进程(Orphan)定义危害处理 三、僵尸进程定义处理 四、守护进程(Daemon )定义作用 总结 一、进程关系&#xff1f; 亲缘关系&#xff1a;亲缘关系主要体现于父子进程&#xff0c;子进程父进程创建&#xff0c;代码继承于父进程&…...

【线性代数】【一】1.6 矩阵的可逆性与线性方程组的解

文章目录 前言一、求解逆矩阵二、线性方程组的解的存在性总结 前言 前文我们引入了逆矩阵的概念&#xff0c;紧接着我们就需要讨论一个矩阵逆的存在性以及如何求解这个逆矩阵。最后再回归上最初的线性方程组的解&#xff0c;分析其中的联系。 一、求解逆矩阵 我们先回想一下在…...

基于大型语言模型的全双工语音对话方案

摘要解读 我们提出了一种能够以全双工方式运行的生成性对话系统&#xff0c;实现了无缝互动。该系统基于一个精心调整的大型语言模型&#xff08;LLM&#xff09;&#xff0c;使其能够感知模块、运动功能模块以及一个具有两种状态&#xff08;称为神经有限状态机&#xff0c;n…...

Spring Boot集成Minio插件快速入门

1 Minio介绍 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&…...

【C++新特性】右值引用

右值和右值的区别 C11 中右值可以分为两种&#xff1a;一个是将亡值&#xff08; xvalue, expiring value&#xff09;&#xff0c;另一个则是纯右值&#xff08; prvalue, PureRvalue&#xff09;&#xff1a; 纯右值&#xff1a;非引用返回的临时变量、运算表达式产生的临时变…...

信息安全基础知识(完整)

信息安全基础知识 安全策略表达模型是一种对安全需求与安全策略的抽象概念表达&#xff0c;一般分为自主访问控制模型&#xff08;HRU&#xff09;和强制访问控制模型&#xff08;BLP、Biba&#xff09;IDS基本原理是通过分析网络行为&#xff08;访问方式、访问量、与历史访问…...

QT

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) ,Gcancle(new QPushButton("取消",this)) ,EmmEdit(new QLineEdit(this)) { ui->setupUi(this);…...

双例集合(三)——双例集合的实现类之TreeMap容器类

Map接口有两个实现类&#xff0c;一个是HashMap容器类&#xff0c;另一个是TreeMap容器类。TreeMap容器类的使用在API上于HashMap容器类没有太大的区别。它们的区别主要体现在两个方面&#xff0c;一个是底层实现方式上&#xff0c;HashMap是基于Hash算法来实现的吗&#xff0c…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...