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

news2024/12/23 5:08:01

卡码网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); // 将与其链接的陆地都标记上 true
                gridNum[mark] = count; // 记录每一个岛屿的面积
                mark++; // 记录下一个岛屿编号
            }
        }
    }
}

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

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

相关文章

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

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

功能测试【测试用例模板、Bug模板、手机App测试】

功能测试 Day01 web项目环境与测试流程、业务流程测试一、【了解】web项目环境说明1.1 环境的定义&#xff1a;项目运行所需要的所有的软件和硬件组合1.2 环境(服务器)的组成&#xff1a;操作系统数据库web应用程序项目代码1.3 面试题&#xff1a;你们公司有几套环境&#xff1…

【对抗去偏】BiasAdv: Bias-Adversarial Augmentation for Model Debiasing

原文标题&#xff1a; BiasAdv: Bias-Adversarial Augmentation for Model Debiasing 原文代码&#xff1a; 暂无 发布年度&#xff1a; 2023 发布期刊&#xff1a; CVPR 摘要 Neural networks are often prone to bias toward spurious correlations inherent in a dataset, …

路由器的Wi-Fi性能是否限制了你的网速?这里有你想要的答案

​你的无线网络速度阻碍了你吗?信不信由你,升级到超快的互联网计划可能不值得。以下是如何判断路由器的Wi-Fi速度是否阻碍了你,以及你能做些什么。 如何测试你的Wi-Fi速度 比较你的有线速度和无线速度可以表明你的路由器是否阻碍了你。虽然很多人认为“Wi-Fi”和“互联网”…

网络虚拟化考题

vrrp讲过吗&#xff1f;&#xff1f;&#xff1f; d 每一层都是什么设备啊 abcd 为啥流量不可控不可视 c是啥意思 讲过吗 abc aNET网络虚拟化是啥啊 为啥&#xff1f;&#xff1f; 啥是CDN&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;

【python】OpenCV——Color Correction

文章目录 cv2.aruco 介绍imutils.perspective.four_point_transform 介绍skimage.exposure.match_histograms 介绍牛刀小试遇到的问题 参考学习来自 OpenCV基础&#xff08;18&#xff09;使用 OpenCV 和 Python 进行自动色彩校正 cv2.aruco 介绍 一、cv2.aruco模块概述 cv2.…

关于微信小程序取消获取用户昵称的一些思考

官方说明&#xff0c;有部分小程序乱用授权&#xff0c;强迫用户提交头像和昵称。 核心是微信担心用户信息被滥用。 其一 &#xff0c;微信头像经常是本人真是照片&#xff0c;在现在人工智能算法的加持下&#xff0c;人脸数据太容易被套取。 其二&#xff0c;微信名称同理&…

node版本过高出现ERR_OSSL_EVP_UNSUPPORTED错误

错误原因&#xff1a; 新版本的nodejs使用的openssl和旧版本不同&#xff0c;导致出错 解决方法&#xff1a; 1.将node版本重新换回16.x 2 windows 下 在package.json文件下添加set NODE_OPTIONS--openssl-legacy-provider && "scripts": {"dev"…

手把手教你java CPU飙升300%如何优化

背景 今天有个项目运行一段时间后&#xff0c;cpu老是不堪负载。 排查 top 命令 TOP 命令 top t 按cpu 排序 top m 按内存使用率排序 从上面看很快看出是 pid 4338 这个进程资源消耗很高。 top -Hp pid top -Hp 4338 找到对应线程消耗的资源shftp cpu占用进行排序&#xf…

拒绝零散碎片, 一文理清MySQL的各种锁

系列文章目录 学习MySQL先有全局观&#xff0c;细说其发展历程及特点 Mysql常用操作&#xff0c;谈谈排序与分页 拒绝零散碎片&#xff0c; 一文理清MySQL的各种锁&#xff08;收藏向&#xff09; 系列文章目录一、MySQL的锁指什么二、排他与共享三、全局锁&#xff08;Global…

数据仓库的实际应用示例-广告投放平台为例

数据仓库的数据分层通常包括以下几层&#xff1a; ODS层&#xff1a;存放原始数据&#xff0c;如日志数据和结构化数据。DWD层&#xff1a;进行数据清洗、脱敏、维度退化和格式转换。DWS层&#xff1a;用于宽表聚合值和主题加工。ADS层&#xff1a;面向业务定制的应用数据层。…

从零入手人工智能(4)—— 逻辑回归

1.小故事 一家金融科技公司&#xff0c;公司的首席执行官找到团队提出了一个紧迫的问题&#xff1a;“我们如何提前知道哪些客户可能会违约贷款&#xff1f;” 这让团队陷入了沉思&#xff0c;经过激烈讨论团队中的数据分析师提议&#xff1a;“我们可以尝试使用逻辑回归来预测…

解决双击bootstrap.bat没有生成b2.exe文件

双击bootstrap.bat但是并没有没有生成b2.exe文件&#xff0c;会报如下错误&#xff1a; "cl" 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。D:\cppsoft\boost_1_85_0\tools\build\src\engine>dir *.exe 驱动器 D 中的卷是 Data 卷的序列号是…

六、在Qt下通过PCL在VTK9.3.0下显示自己的pcd点云文件

前几天刚整理好VTK8.2.0&#xff0c;发现我们的项目使用的PCL自带的VTK是9.3.0的&#xff0c;脸黑了快 VTK8.2.0可参考该篇博文&#xff1a;五、在Qt下加载QVTKWidget控件&#xff08;VTK8.2.0&#xff09;&#xff0c;生成Visual Studio项目&#xff0c;显示点云&#xff08;C…

如何基于项目人力和管线方案选择FGUI和UGUI

1&#xff09;如何基于项目人力和管线方案选择FGUI和UGUI 2&#xff09;TMP字体出包丢失字体描边 3&#xff09;如何将一张贴图经过Shader处理后的结果输出给另外一个Shader使用 4&#xff09;为什么我的水这么干净&#xff0c;和UE教程里的有差别 这是第390篇UWA技术知识分享的…

ECharts Y轴倒置,X轴顶部,图表反向

1.配置&#xff1a; xAxis:{position: ‘top’} //让x轴在顶部 yAxis: { inverse:true} //让Y轴坐标为反向坐标 2.将数据的只转换成负值&#xff08;不建议&#xff09;&#xff0c;显示的时候formatter里面在显示正值&#xff08;不建议&#xff09;

强化安全新篇章:韶关石油化工可燃气体报警器年检解析

韶关&#xff0c;这座位于广东省北部的城市&#xff0c;近年来在石油化工行业取得了显著的发展。 随着一批批大型石化企业的进驻和投产&#xff0c;韶关不仅成为了区域性的石化产业基地&#xff0c;也为地方经济带来了强劲的增长动力。 然而&#xff0c;随着石化产业的快速发…

使用asyncua模块的subscribe_data_change监控opcua的Server节点数据变化

报错信息如下&#xff1b; ERROR:asyncua.common.subscription:DataChange subscription created but handler has no datachange_notification method 上述报错原因在于创建监控句柄SubscriptionHandler类时&#xff0c;节点数据变化的函数名称有问题&#xff0c;不是默认的da…

【NLP练习】Transformer实战-单词预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 任务&#xff1a;自定义输入一段英文文本进行预测 一、定义模型 from tempfile import TemporaryDirectory from typing import Tuple from torch import nn…

DVWA 靶场 Open HTTP Redirect 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…