代码随想录训练营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;
}

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

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

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

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

相关文章

SCI一区TOP|双曲正弦余弦优化算法(SCHO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年&#xff0c;J Bai受到双曲正弦余弦函数启发&#xff0c;提出了双曲正弦余弦优化算法&#xff08;Sinh Cosh optimizer, SCHO&#xff09;。 2.算法原理 2.1算法思想 SCHO灵感来源…

1panel + Pbootcms 设置伪静态规则

这里确保我们引用的样式路径是否是这样的&#xff0c;&#xff08;不然可能会设置了伪静态无法加载样式&#xff09; //这种格式在不开起伪静态是可以引入的&#xff0c;一旦开启就不行了,一定要在static 前面加上反斜杠 /<link rel"stylesheet" href"{pbo…

【数据分享】《中国法律年鉴》1987-2022

而今天要免费分享的数据就是1987-2022年间出版的《中国法律年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 自1987年起&#xff0c;《中国法律年鉴》作为一部全面记录中国法律发展进程的重要文献&#xff0c;见证了中国法治建设的每…

python魔法__dir__和__dict__

# 魔法方法dir, __dir__, __dict__class Student:address "wh" # 类属性def __init__(self, name):self.name name # 对象属性self._age 20self.__tel "123456"staticmethoddef static_func():...# __dir__: 查看对象的方法和属性 st Student("z…

【linux】6.9.0系统调用接口列表,一共644个

文件生成命令行&#xff1a; grep "ifdef" /usr/include/x86_64-linux-gnu/bits/syscall.h | awk { print $2 } >/mnt/hgfs/Share/syscall_small.h __NR_FAST_atomic_update __NR_FAST_cmpxchg __NR_FAST_cmpxchg64 __NR__llseek __NR__newselect __NR__sysctl …

Linux服务升级:Almalinux 升级 WebCatlog桌面程序

目录 一、实验 1.环境 2.Almalinux 升级 WebCatlog桌面程序 二、问题 1.Ubuntu如何升级 WebCatlog桌面程序 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本软件IP备注Almalinux9.4 WebCatlog 192.168.204.150 &#xff08;2&#xff09;Termi…

odoo17 小变更4

odoo17 小变更4 1、代码中去除了访问私人地址权限,但翻译中均还有,怪不 model:res.groups,name:base.group_private_addresses msgid "Access to Private Addresses" msgstr "" 代码也查看了,的确没有了此权限组 --><record model="res.g…

大聪明教你学Java | 深入浅出聊 Kafka

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

35 - 最后一个能进入巴士的人(高频 SQL 50 题基础版)

35 - 最后一个能进入巴士的人 -- sum(weight) over(order by turn) as total,根据turn升序&#xff0c;再求前面数的和 selectperson_name from(selectperson_name,sum(weight) over(order by turn) as totalfromQueue) new_Queue wheretotal<1000 order by total desc lim…

华为终于要“三分天下”

在被苹果iOS、谷歌安卓长期统治的手机操作系统市场中&#xff0c;一个新操作系统要想杀出来需要多久&#xff1f;华为给出的答案是五年。 6月21日&#xff0c;华为迎来了其过去五年来最扬眉吐气的一次开发者大会。大会首日&#xff0c;HarmonyOS NEXT鸿蒙星河版正式开启开发者…

34 - 指定日期的产品价格(高频 SQL 50 题基础版)

34 - 指定日期的产品价格 -- row_number(行号) 生成连续的序号&#xff0c;不考虑分数相同 -- 在2019-08-16之前改的价格&#xff0c;使用最近一期的日期&#xff0c;没有在2019-08-16之前改的价格&#xff0c;默认价格为10 select t.product_id, t.new_price as price from (s…

Idea安装插件刷Leetcode

一、下载插件 idea版本2022以下两个插件都可以用来刷Leetcode 二、登录Leetcode 获取token 登录 三、配置 配置1 配置2 Code FileName C$!velocityTool.leftPadZeros($!{question.frontendQuestionId},4)$!velocityTool.replace(${question.title}," ","&qu…

通过这10个SQL优化手段,让你的SQL提升10倍效率

涉及到SQL优化时&#xff0c;有许多策略和技术可以帮助我们提升查询性能和数据库效率。下面将对10个SQL优化手段详细的说明一下&#xff0c;提供代码。 1.使用索引 在数据库中正确使用索引可以显著提升查询性能。索引可以加速数据的查找和过滤操作。 -- 创建索引 CREATE IND…

Redis进阶 - 朝生暮死之Redis过期策略

概述 Redis 是一种常用的内存数据库&#xff0c;其所有的数据结构都可以设置过期时间&#xff0c;时间一到&#xff0c;就会自动删除。你可以想象 Redis 内部有一个死神&#xff0c;时刻盯着所有设置了过期时间的 key&#xff0c;寿命一到就会立即收割。 你还可以进一步站在死神…

MSPM0G3507 ——GPIO例程讲解2——simultaneous_interrupts

主函数&#xff1a; #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();/* Enable Interrupt for both GPIOA and GPIOB ports */NVIC_EnableIRQ(GPIO_SWITCHES_GPIOA_INT_IRQN); //启用SWITCHES——A的中断 NVIC_EnableIRQ(GPIO_S…

Java中的Lambda表达式:从入门到精通

Java中的Lambda表达式&#xff1a;从入门到精通 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; Lambda表达式是Java 8引入的一项重要特性&#xff0c;它为Jav…

【数据结构与算法】哈夫曼树,哈夫曼编码 详解

哈夫曼树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right; }; using HuffmanTree TreeNode *;结构体包含三个成员&#xff1a; data 是一个 ElemType 类型的变量&#xff0c;用于存储哈夫曼树节点的数据。left 是一个指向 TreeNode 类型的指针&#xf…

2024.06.20【读书笔记】丨生物信息学与功能基因组学(第十六章 真核生物基因组 第四部分)【AI测试版】

《生物信息学与功能基因组学》第十六章读书笔记(第四部分) 真核基因组的比较分析 真核生物基因组的比较分析有助于揭示不同物种间的进化关系和生物学特性。通过比较不同物种的基因组序列,可以发现保守的基因区域和快速进化的基因家族。 基因组水平转移 基因组水平转移是…

MATLAB句柄简记

文章目录 MATLAB句柄函数句柄的简单操作函数 MATLAB句柄 MATLAB平台对于函数调用分为直接调用和间接调用。直接调用即调用子函数。   子函数只能被与它所在M文件同名的主函数或者在M文件内的其他函数调用。一个文件只能有一个主函数。   使用函数句柄可以避免上述问题。句柄…

docker镜像基本操作

文章目录 前言1. 列出本地镜像2. 搜索 Docker Hub 上的镜像3. 拉取镜像4. 删除镜像5. 删除多个镜像6. 强制删除镜像7. 导出镜像8. 导入镜像9. 标记镜像10. 构建镜像11. 检查镜像12. 镜像历史 前言 Docker 镜像是只读模板&#xff0c;用于创建 Docker 容器。以下是一些常用的 D…