第六十六天打卡 | 卡码网101 孤岛的总面积、卡码网102 沉没孤岛、卡码网103 水流问题、卡码网104 建造最大岛屿

卡码网101 孤岛的总面积


这一题在昨天的基础上,将比较得出最大孤岛面积的逻辑改为统计所有孤岛面积之和的逻辑即可。       

最近做项目的时候也发现,很多时候代码逻辑能够复用最好就不要再自己写,防止出错,当然刷代码题的时候不一定是这个样子,就先偷个懒哈

#include <iostream>
#include <vector>
#include <queue>
using namespace std;int dir[4][2] = {-1, 0, 1, 0, 0, 1, 0, -1};int bfs(vector<vector<int>>& grid, vector<vector<int>>& visited, int i_index, int j_index) {int sum = 0;queue<pair<int, int>> que;que.push(pair<int, int>(i_index, j_index));bool flag = true;while (!que.empty()) {// int num = que.size();// while (num--) {i_index = que.front().first;j_index = que.front().second;for (int i = 0; i < 4; i++) {if (i_index + dir[i][0] >= 0 && i_index + dir[i][0] < grid.size()) {if (j_index + dir[i][1] >= 0 && j_index + dir[i][1] < grid[0].size()) {if (grid[i_index+dir[i][0]][j_index+dir[i][1]] && !visited[i_index+dir[i][0]][j_index+dir[i][1]]) {visited[i_index+dir[i][0]][j_index+dir[i][1]] = 1;if (i_index+dir[i][0] == 0 || i_index+dir[i][0] == grid.size() - 1 || j_index+dir[i][1] == 0 || j_index+dir[i][1] == grid[0].size() - 1){flag = false; }sum++;que.push(pair<int, int>(i_index+dir[i][0],j_index+dir[i][1]));}}}}   que.pop();// }}if (flag)return sum + 1;else return 0;
}int main() {int n, m;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));vector<vector<int>> visited(n, vector<int>(m, 0));int sum = 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 (grid[i][j] && !visited[i][j]) {visited[i][j] = 1;// if (sum < bfs(grid, visited, i, j))if (i == 0 || i == grid.size() - 1 || j == 0 || j == grid[0].size() - 1){bfs(grid, visited, i, j);   }else sum += bfs(grid, visited, i, j);// cout << sum << endl;}}}cout << sum << endl;return 0;
}

卡码网102 沉没孤岛


先要用一个bfs的逻辑或者一个dfs的逻辑判断是否是孤岛,即是否遍历到的横向或者纵向相连的所有节点都不和最外层边界直接触碰,这里传参数有个技巧,原本都是用的引用,这里在传入visited数组的时候不用加引用符对原visited数组进行修改,否则就是直接在遍历了。

在第二次修改孤岛的时候再用原先的visited数组加上引用就行。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;int dir[4][2] = {-1, 0, 1, 0, 0, 1, 0, -1};/** Description: 判断是否是孤岛*/bool ifIsolated(vector<vector<int>>& grid, vector<vector<int>> visited, int i_index, int j_index) {queue<pair<int, int>> que;que.push(pair<int, int>(i_index, j_index));bool flag = true;while (!que.empty()) {// int num = que.size();// while (num--) {i_index = que.front().first;j_index = que.front().second;for (int i = 0; i < 4; i++) {if (i_index + dir[i][0] >= 0 && i_index + dir[i][0] < grid.size()) {if (j_index + dir[i][1] >= 0 && j_index + dir[i][1] < grid[0].size()) {if (grid[i_index+dir[i][0]][j_index+dir[i][1]] && !visited[i_index+dir[i][0]][j_index+dir[i][1]]) {visited[i_index+dir[i][0]][j_index+dir[i][1]] = 1;if (i_index+dir[i][0] == 0 || i_index+dir[i][0] == grid.size() - 1 || j_index+dir[i][1] == 0 || j_index+dir[i][1] == grid[0].size() - 1){flag = false; }que.push(pair<int, int>(i_index+dir[i][0],j_index+dir[i][1]));}}}}   que.pop();// }}return flag;
} /** * Description: 孤岛取反*/
void bfs(vector<vector<int>>& grid, vector<vector<int>>& visited, int i_index, int j_index, bool flag) {if (flag) grid[i_index][j_index] = 0;queue<pair<int, int>> que;que.push(pair<int, int>(i_index, j_index));while (!que.empty()) {i_index = que.front().first;j_index = que.front().second;for (int i = 0; i < 4; i++) {if (i_index + dir[i][0] >= 0 && i_index + dir[i][0] < grid.size()) {if (j_index + dir[i][1] >= 0 && j_index + dir[i][1] < grid[0].size()) {if (grid[i_index+dir[i][0]][j_index+dir[i][1]] && !visited[i_index+dir[i][0]][j_index+dir[i][1]]) {visited[i_index+dir[i][0]][j_index+dir[i][1]] = 1;if (flag == true) grid[i_index+dir[i][0]][j_index+dir[i][1]] = 0;que.push(pair<int, int>(i_index+dir[i][0],j_index+dir[i][1]));}}}}   que.pop();// }}
}int main() {int n, m;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));vector<vector<int>> visited(n, vector<int>(m, 0));bool flag = true;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 (grid[i][j] && !visited[i][j]) {visited[i][j] = 1;// if (sum < bfs(grid, visited, i, j))if (i == 0 || i == grid.size() - 1 || j == 0 || j == grid[0].size() - 1){flag = false;bfs(grid, visited, i, j, flag);   }else {flag = ifIsolated(grid, visited, i, j);bfs(grid, visited, i, j, flag);   }}}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cout << grid[i][j] << ' ';}cout << endl;}return 0;
}

卡码网103 水流问题


训练营越到后面,其实是越来越顺的,一方面是有了动量和习惯气的支撑,另一方面也是前面的知识和编程技巧掌握了之后对于后面的解题很自然而然就用到了,所以建议前面的题目还是要认真刷,有时间的话建议也像这样子每天写个博客总结记录下,后面可以当成笔记来复习的。

这一题逻辑和前面的就比较像,可以自行进行思考尝试,这里给出我写的代码,权当抛砖引玉了

#include <iostream>
#include <vector>
#include <queue>
using namespace std;int dir[4][2] = {-1, 0, 1, 0, 0, 1, 0, -1};/** Description: 判断是否是符合条件的点*/bool ifAble(vector<vector<int>>& grid, vector<vector<int>> visited, int i_index, int j_index) {queue<pair<int, int>> que;que.push(pair<int, int>(i_index, j_index));bool flagl_u = false;bool flagr_d = false;if (i_index == 0 ||  j_index == 0){flagl_u = true; }if (i_index == grid.size() - 1 || j_index == grid[0].size() - 1) {flagr_d = true;}if (flagl_u && flagr_d) return true;while (!que.empty()) {i_index = que.front().first;j_index = que.front().second;for (int i = 0; i < 4; i++) {if (i_index + dir[i][0] >= 0 && i_index + dir[i][0] < grid.size()) {if (j_index + dir[i][1] >= 0 && j_index + dir[i][1] < grid[0].size()) {if (grid[i_index+dir[i][0]][j_index+dir[i][1]] <= grid[i_index][j_index] &&!visited[i_index+dir[i][0]][j_index+dir[i][1]]) {visited[i_index+dir[i][0]][j_index+dir[i][1]] = 1;if (i_index+dir[i][0] == 0 ||  j_index+dir[i][1] == 0){flagl_u = true; }if (i_index+dir[i][0] == grid.size() - 1 || j_index+dir[i][1] == grid[0].size() - 1) {flagr_d = true;}if (flagl_u && flagr_d) return true;que.push(pair<int, int>(i_index+dir[i][0],j_index+dir[i][1]));}}}}   que.pop();// }}return flagl_u && flagr_d;
} int main() {int n, m;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));vector<vector<int>> visited(n, vector<int>(m, 0));bool flag = true;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 (ifAble(grid, visited, i, j)) {cout << i << ' ' << j << endl;}}}return 0;
}

卡码网104 建造最大岛屿


(暂时没想出来,给出题解如下,可自行学习,后面再改改)

每次深搜遍历计算最大岛屿面积,都做了很多重复的工作。

只要用一次深搜把每个岛屿的面积记录下来就好。

第一步:一次遍历地图,得出各个岛屿的面积,并做编号记录。可以使用map记录,key为岛屿编号,value为岛屿面积

第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。

拿如下地图的岛屿情况来举例: (1为陆地)

第一步,则遍历题目,并将岛屿到编号和面积上的统计,过程如图所示:

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
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);}
}int largestIsland(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited = vector<vector<bool>>(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); // 将与其链接的陆地都标记上 truegridNum[mark] = count; // 记录每一个岛屿的面积mark++; // 记录下一个岛屿编号}}}
}

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

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

相关文章

webpack总结16--webpack入门学习

总结 通过前面的内容我们学会了 Webpack 基本使用&#xff0c;掌握了以下功能&#xff1a; 1.两种开发模式 开发模式&#xff1a;代码能编译自动化运行生产模式&#xff1a;代码编译优化输出 2.Webpack 基本功能 开发模式&#xff1a;可以编译 ES Module 语法生产模式&#…

V4L2读取摄像头资源

1.V4L2 它是Linux内核中标准的关于视频驱动程序&#xff0c;Video for Linux 2&#xff0c;简称V4L2。 它为Linux下的视频驱动提供了统一的接口&#xff0c;使得应用程序可以使用统一的API操作不同的视频设备。 V4L2支持三类设备&#xff1a;视频输入输出设备、VBI设备和rad…

MongoDB的Go语言操作示例总结

目录 前提条件 连接到MongoDB 简单示例 插入文档 查询文档 查询单个文档 查询多个文档 更新文档 更新单个文档 更新多个文档 删除文档 删除单个文档 删除多个文档 聚合管道 常见聚合操作符 $match $group $project $sort $limit $skip $lookup $unwind …

LeetCode---402周赛

题目列表 3184. 构成整天的下标对数目 I 3185. 构成整天的下标对数目 II 3186. 施咒的最大总伤害 3187. 数组中的峰值 一、构成整天的下标对数目 I & II 可以直接二重for循环暴力遍历出所有的下标对&#xff0c;然后统计符合条件的下标对数目返回。代码如下 class So…

概率论与数理统计期末复习

概率论常考知识点汇总 总括 1. 基础概率论 概率定义&#xff1a;理解概率是事件发生的可能性度量&#xff0c;范围从0&#xff08;不可能&#xff09;到1&#xff08;必然发生&#xff09;。概率公理&#xff1a;掌握概率的三大公理&#xff0c;即非负性、规范性和可加性。条…

深入理解 Nginx 的正向代理和反向代理

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

专利的黑白图片处理:

1&#xff0c;本来是彩色图片&#xff0c;首先就是使用滤镜处理成黑白的 2&#xff0c;插入word中的时候&#xff0c;直接讲图片的背景色设置成和word一样的颜色 如何在word文档里插入图片&#xff0c;让插入图片的背景颜色变成和word文档背景相同的白色&#xff1f;...急求啊…

HTML静态网页成品作业(HTML+CSS)——美食火锅介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

微信对话生成器2.0版本

微信对话生成器2.0版&#xff0c;这是一款革命性的通讯辅助工具&#xff0c;在数字通信领域带来了新的创新浪潮。这一升级版的生成器不仅囊括了从基本的文字编辑、格式调整到语音转换的多种功能&#xff0c;更重要的是&#xff0c;它提供了模拟真实对话的能力&#xff0c;使得用…

使用 git 遇到权限错误,重新生成SSH密钥

如果在执行 git 相关的命令的时候遇到权限错误&#xff0c;可能是因为你之前使用了不同的用户名在本地生成了SSH密钥。你可以尝试以下步骤来解决这个问题&#xff1a; 打开终端&#xff0c;并执行以下命令来删除旧的SSH密钥文件&#xff1a; rm ~/.ssh/id_rsa rm ~/.ssh/id_rsa…

容器之对齐构件

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_ne…

C++ 72 之 友元和类模版

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string>// 写法2&#xff1a; // template<class T1, class T2> // class Students12;// 要提前用到Students12&#xff0c;需要在前面先让编译器见过Students12才可…

汇聚荣做拼多多运营口碑怎么样?

拼多多作为国内领先的电商平台&#xff0c;其运营口碑一直是业界和消费者关注的焦点。汇聚荣作为拼多多的运营服务商&#xff0c;其服务质量直接影响到拼多多平台的用户体验和品牌形象。那么&#xff0c;汇聚荣做拼多多运营口碑怎么样呢? 一、服务响应速度 汇聚荣在服务响应速…

树莓派4B学习笔记11:PC端网线SSH连接树莓派_网线连接请求超时问题解决

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习使用网线连接树莓派&#xff0c;网线可以提供更…

vos3000外呼系统通话会话超时中断详解

在VOS3000中&#xff0c;通话会话超时中断可能由多种因素引起。这些因素包括网络问题、配置错误、硬件资源不足等。以下是一些可能导致通话会话超时中断的详细解释&#xff1a; 网络问题&#xff1a; 网络延迟和丢包&#xff1a;网络延迟或丢包会导致数据包在传输过程中被丢弃或…

邮件推送服务商有哪些核心功能?怎么选择?

邮件推送服务商支持哪些营销工具&#xff1f;推送性能如何评估&#xff1f; 邮件推送服务商的核心功能可以帮助企业更高效地管理和优化其电子邮件营销活动&#xff0c;从而提升客户参与度和转化率。AokSend将详细介绍邮件推送服务商的一些核心功能。 邮件推送服务商&#xff…

弹窗‘xlive.dll没有被指定在Windows’要怎么解决?教你4种修复xlive.dll的方法

大家在使用电脑期间是否曾遭遇过一个弹窗警告&#xff0c;“xlive.dll没有被指定在Windows”&#xff1f;假如你确实碰到过这样的问题&#xff0c;当时你是如何应对xlive.dll文件缺失的状况呢&#xff1f;对于那些还不清楚如何处理此问题的朋友们&#xff0c;接下来所述的几种方…

Go单测时的Parallel

在 Go 语言中&#xff0c;t.Parallel() 通常用于测试代码中&#xff0c;表示将当前的测试用例标记为可以并行执行。 当在测试函数中调用 t.Parallel() 后&#xff0c;测试框架会尝试在多个 goroutine 中并行地执行被标记的测试用例。 这可以显著提高测试的执行效率&#xff0c;…

用Python的Pygame包实现水果忍者小游戏

先上一下运行结果 长按鼠标左键出刀, 切割水果几分, 切割炸弹结束游戏, 漏掉的水果也会几分, 难度会随时间慢慢提高(水果的刷新频率变快) 初始化 帧率200帧/秒, 游戏窗口大小800600 # 游戏设置 pygame.init() FPS 200 fpsClock pygame.time.Clock() WIDTH, HEIGHT 800, 60…

比官方镜像体积还小的基于Anolis OS8.6的Python3.8.8的编译安装Dockerfile

本次编译安装解决了安装3.8.8编译安装过程中的所有报错&#xff0c;同时&#xff0c;OpenSSL升级至3.0.14、内置Git&#xff0c;支持IPv6&#xff0c;Python环境同时预安装httpx和boto3模块。 FROM openanolis/anolisos:8.6 as PYTHONARG PYTHON_VERSION"3.8.8" ARG…