第六十六天打卡 | 卡码网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,一经查实,立即删除!

相关文章

V4L2读取摄像头资源

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

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;即非负性、规范性和可加性。条…

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

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

微信对话生成器2.0版本

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

容器之对齐构件

代码&#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;网线可以提供更…

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

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

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

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

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

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

【FPGA】静态分析与时序约束(持续更新

Reference&#xff1a; V2静态时序分析与时序约束文档 入门 无时序约束场景中&#xff0c;普通图像显示不清晰&#xff0c;千兆网口接收Ethernet package 数据不正常&#xff0c;红外场景中图像显示不正常 Definition&#xff1a; 我们提出一些特定的时序要求&#xff08;或…

文章MSM_metagenomics(七):分组马赛克图

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 本教程是使用一个Python脚本来绘制马赛克图&#xff0c;用于可视化两个变量的频率分布。 数…

我的Mac疯了!居然可以生成这样的奇葩AI图片!

在当今人工智能领域&#xff0c;midjourney无疑是生成图片的王者&#xff0c;但是苦于付费才能使用&#xff0c;今天我就给大家分享一下midjourney平替stable diffusion&#xff0c;实现本地生成不逊色于midjourney的图片 效果图 先上一个我自己生成的效果(就是在我的Mac上用C…

【anaconda】本地永久设置镜像源

【anaconda】本地永久设置镜像源 可以通过命令行设置全局的 pip 配置&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

python字符串的一些操作实例

已知字符串 a “aAsomr3idd4HGHbigs7Dlsf9YeAF”&#xff0c;要求如下 1. 请将a字符串的大写改为小写&#xff0c;小写改为大写。 2.将a字符串的数字取出&#xff0c;并输出成一个新的字符串。 3.将a字符串中的内容反向输出 4.打印a字符串中所有奇数位上的字符(下标是1&#x…

【已解决】手机进入fastboot无法退出

文章目录 报错及效果图报错代码效果图 解决方案必要的解决方法可能有用的解决方法 报错及效果图 报错代码 手机屏幕显示fastboot&#xff0c;长按电源键无法正常启动 效果图 解决方案 必要的解决方法 1.在电脑上下载并安装adb/fastboot驱动&#xff0c;可以在这里免费下载&…

【机器学习300问】129、RNN如何在情感分析任务中起作用的?

情感分析是自然语言处理&#xff08;NLP&#xff09;领域的一个重要分支&#xff0c;它的目标是自动检测和提取出非结构化文本数据中的主观信息&#xff08;比如&#xff1a;情绪、意见、评价等&#xff09; 一、情感分析任务案例 分析电商产品评论的情感倾向&#xff08;三分类…

MySQL之复制(九)

复制 复制管理和维护 确定主备是否一致 在理想情况下&#xff0c;备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误&#xff0c;备库同样可能因为MySQL自身的特性导致数据不一致&#xff0c;例如MySQL的Bug、网络中断、服务…