代码随想录算法训练营第五十八天|KMC101 孤岛的总面积、KMC102 沉没孤岛、KMC103 水流问题

题1:

指路:101. 孤岛的总面积 (kamacoder.com)
思路与代码:

本题要求找到不靠边的陆地面积,那么我们从地图的最外层开始遍历,找到靠近四个边的陆地,通过搜索将周边靠陆地且相邻的陆地1变成海洋0,重新遍历地图统计剩下的陆地1即可。代码如下:

#include<iostream>
#include<vector>
using namespace std;int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};  // 保存四个方向
int count;  // 统计符合要求的陆地空格数量
void dfs(vector<vector<int>>& grid, int x, int y) {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;if (grid[nextx][nexty] == 0) continue;dfs (grid, 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];}}// 从左右两次向中间遍历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);}count = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 1) dfs(grid, i, j);}}cout << count << endl;
}

题2:

指路:102. 沉没孤岛 (kamacoder.com)
思路与代码:

本题与上题的区别在于,要将孤岛1变成水域0,从地图周边开始,在空格相邻的陆地标记,遍历地图遇到陆地且无标记的变成水域1即可。其中,无需另外定义一个二维数组将陆地与原数组对比比较,可以直接将陆地实行特殊标记2。首先,dfs将地图周边的陆地1变成特殊标记2,然后将水域0中间的陆地1变成水域0,最后将特殊标记2改成陆地1即可。代码如下:

#include<iostream>
#include<vector>
using namespace std;int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; void dfs (vector<vector<int>>& grid, int x, int y) {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;// 不符合条件退出if (grid[nextx][nexty] == 0 || grid[nextx][nexty] == 2)continue;dfs (grid, 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];}}// 从左右向中间遍历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;}// return 0;
}

题3:

指路:103. 水流问题 (kamacoder.com)
思路与代码:

要求节点能到达第以一边界和第二边界。遍历即可,如果这个节点能同时到达第一和第二边界,那么该节点符合结果集条件,写出来发现超时(见下面代码中的灰色注释部分)。那么对其进行优化:从第一组边界和第二组边界开始遍历,标记遍历过的节点,如果同时标记则表示节点可到达。代码如下:

#include<iostream>
#include<vector>
using namespace std;
//到达第一边界或达到第二边界
//
int n, m;
int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};// 辅助数组visited
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;if (grid[x][y] > grid[nextx][nexty]) continue;dfs (grid, visited, nextx, nexty);}return ;
}/*  bool isResult (vector<vector<int>>& grid, int x, int y) {vector<vector<bool>> visited(n, vector<bool> (m, false)) ;dfs (grid, visited, x, y);bool isFirst = false;bool isSecond = false;//  第一边界中的上边界for (int j = 0; j < m; j++) {if (visited[0][j]) {isFirst = true;break;}}// 第一边界中的左边界for (int i = 0; i < n; i++) {if (visited[i][0]) {isFirst = true;break;}}// 第二边界中的右边界for (int j = 0;j < m; j++) {if (visited[n - 1][j]) {isSecond = true;break;}}// 第二边界中的下边界for (int i = 0; i < n; i++) {if (visited[i][m - 1]) {isSecond = true;break;}}if (isFirst && isSecond) return true;return false;}*/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];}}/* for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (isResult (grid, i, j)) {cout << i << " " << j << endl;}}}*/// 第一组的边界上的节点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, secondBorder, 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;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【驱动篇】龙芯LS2K0300之PWM设备驱动

实验目的 利用脉冲调制效应&#xff08;PWM&#xff09;等效改变输出功率大小控制LED&#xff0c;从而实现呼吸灯效果&#xff0c;需要用到RGB LED模块 模块连接 IO 插针接口上一共集成了两路PWM&#xff0c;分别是PWM2和PWM3&#xff0c;对应GPIO88、GPIO89 PWM2和PWM3对…

期末考试结束,老师该如何私发成绩?

随着期末考试的落幕&#xff0c;校园里又恢复了往日的宁静。然而&#xff0c;对于老师们来说&#xff0c;这并不意味着工作的结束&#xff0c;相反&#xff0c;一系列繁琐的任务才刚刚开始。 成绩单的发放&#xff0c;就是其中一项让人头疼的工作。家长们焦急地等待着孩子的考试…

Python程序打包成EXE文件指南

本套课在线学习视频&#xff08;网盘地址&#xff0c;保存到网盘即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/57ba5f313c5b​​ 将Python程序打包成可执行文件&#xff08;EXE&#xff09;可以方便用户在没有Python环境的计算机上运行程序。本文将详细…

【Linux】在线求助命令--help,man page , info page

我们知道Linux有很多的命令&#xff0c;那LInux要不要背命令&#xff1f; 答案是背最常用的那些就行了 那有的时候我们想查询一些命令的详细用法该怎么办呢&#xff1f; 这里我给出3种方法 1.--help --help的使用方法很简单啊 要查询的命令 --help 我们看个例子 这里我只…

C语言4 运算符

目录 1. 算术运算符 2. 关系运算符 3. 逻辑运算符 4. 位运算符 5. 赋值运算符 6. 自增和自减运算符 7. 条件运算符&#xff08;三元运算符&#xff09; 8. 逗号运算符 9. sizeof 运算符 10. 取地址和解引用运算符 11.运算符的优先级 1. 算术运算符 (加法)&#xff1…

CRT工具

CRT工具 传输位置设置 打开SFTP alt p 命令 ls&#xff1a;远程机器当前目录内容 lls&#xff1a;传输位置文件的目录内容 pwd&#xff1a;远程机器的当前位置 lpwd&#xff1a;传输位置的位置 get 文件&#xff1a;ftp传输文件 get -r 文件夹&#xff1a;ftp传输文件…

如何获取歌曲id---cloudmusic

X-Requested-With:“XMLHttpRequest”: https://blog.csdn.net/muzico425/article/details/102735413 https://www.runoob.com/xml/xml-http.html https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest 通过该案例主要还是学习一下X-Requested-With:"XMLHtt…

大华DSS user_toLoginPage.action命令执行漏洞

免责声明 本文章仅做网络安全技术研究使用&#xff01;严禁用于非法犯罪行为&#xff0c;请严格遵守国家法律法规&#xff1b;请勿利用文章内的相关技术从事非法测试&#xff0c;如因此产生的一切不良后果与文章作者无关。使用本文所提供的信息或工具即视为同意本免责声明&…

go语言day11 错误 defer(),panic(),recover()

错误&#xff1a; 创建错误 1&#xff09;fmt包下提供的方法 fmt.Errorf(" 格式化字符串信息 " &#xff0c; 空接口类型对象 ) 2&#xff09;errors包下提供的方法 errors.New(" 字符串信息 ") 创建自定义错误 需要实现error接口&#xff0c;而error接口…

JavaSe系列二十七: Java正则表达式

正则表达式 为什么要学习正则表达式再提几个问题解决之道-正则表达式正则表达式基本介绍介绍 正则表达式底层实现实例分析 正则表达式语法基本介绍元字符-转义号 \\\\元字符-字符匹配符元字符-选择匹配符元字符-限定符元字符-定位符分组非贪婪匹配 应用实例对字符串进行如下验证…

学习笔记——动态路由——OSPF聚合(汇总)

十一、OSPF聚合(汇总) 1、路由聚合(汇总) 路由汇总是一种重要的思想&#xff0c;在大型的项目中是必须考虑的一个重点事项。随着网络的规模越来越大&#xff0c;网络中的设备所需维护的路由表项也就会越来越多&#xff0c;路由表的规模也就会逐渐变大&#xff0c;而路由表是需…

React中的useMemo和memo

引言 React是一个声明式的JavaScript库&#xff0c;用于构建用户界面。在开发过程中&#xff0c;性能优化是一个重要的方面。useMemo和memo是React提供的工具&#xff0c;用于帮助开发者避免不必要的渲染和计算&#xff0c;从而提升应用性能。 问题背景 在React应用中&#…

实现antd designable平台的组件拖拽功能

平台&#xff1a;designable设计器 github&#xff1a;designable 目录 1 背景2 技术栈3 组件拖拽和放置3.1 类型定义3.2 拖拽3.3 放置 1 背景 由于业务需求&#xff0c;我们需要实现designable平台的一个简易版的组件拖拽功能。 #mermaid-svg-QrxSDGe9YyGG3LbQ {font-family:…

【Unity2D 2022:UI】制作角色血条

一、创建血底UI 1. 创建画布&#xff08;Canvas&#xff09; 2. 在画布上添加血底图像&#xff08;Image&#xff09;子物体 二、编辑血底UI 1. 将血底图片拖入源图像&#xff08;Source Image&#xff09;中 2. 点击设置为图片的原大小&#xff08;Set Native Size&#x…

设计一个会员卡系统

会员卡系统在现代商业环境中是一个重要的客户关系管理工具。通过会员卡系统&#xff0c;企业可以有效地增加客户粘性&#xff0c;提高客户满意度&#xff0c;进而提升销售额。本文将详细讨论如何设计一个全面的会员卡系统&#xff0c;包括会员卡的类型、权益设计、续费规则、升…

Java | Leetcode Java题解之第219题存在重复元素II

题目&#xff1a; 题解&#xff1a; class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Set<Integer> set new HashSet<Integer>();int length nums.length;for (int i 0; i < length; i) {if (i > k) {set.remove(nums[i - …

# 三 JS的流程控制和函数

三 JS的流程控制和函数 3.1 JS分支结构 if结构 这里的if结构几乎和JAVA中的一样,需要注意的是 if()中的非空字符串会被认为是trueif()中的非零数字会被认为是true 代码 if(false){// 非空字符串 if判断为trueconsole.log(true) }else{console.log(false) } if(){// 长度为0…

GitHub详解:代码托管与协作开发平台

文章目录 一、GitHub简介二、GitHub的核心功能2.1 仓库&#xff08;Repository&#xff09;2.2 版本控制与分支&#xff08;Branch&#xff09;2.3 Pull Request2.4 Issues与Projects2.5 GitHub Actions 三、GitHub的使用方法3.1 注册与登录3.2 创建和管理仓库3.3 使用Git进行代…

【密码学】密码学中的四种攻击方式和两种攻击手段

在密码学中&#xff0c;攻击方式通常指的是密码分析者试图破解加密信息或绕过安全机制的各种策略。根据密码分析者对明文、密文以及加密算法的知识程度&#xff0c;攻击可以分为以下四种基本类型&#xff1a; 一、四种攻击的定义 &#xff08;1&#xff09;唯密文攻击(COA, C…

PCIe驱动开发(2)— 第一个简单驱动编写和测试

PCIe驱动开发&#xff08;2&#xff09;— 第一个简单驱动编写和测试 一、前言 教程参考&#xff1a;02_实战部分_PCIE设备测试 教程参考&#xff1a;03_PCIe设备驱动源码解析 二、驱动编写 新建hello_pcie.c文件 touch hello_pcie.c然后编写内容如下所示&#xff1a; #i…