【代码随想录】【算法训练营】【第58天 2】 [卡码102]沉没孤岛

前言

思路及算法思维,指路 代码随想录。
题目来自 卡码网。

day 58,周四,ding~

题目详情

[卡码102] 沉没孤岛

题目描述

卡码102 沉没孤岛
卡码102 沉没孤岛

解题思路

前提:修改孤岛的值
思路:DFS or BFS,使用visited代替直接修改grad的值
重点:DFS、BFS的实现

代码实现

C语言
DFS
// DFS#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};void dfs(int **grid, int gridSize, int *gridColSize, int colIdx, int rawIdx, bool **visited, bool *island, int *size, bool modify)
{// 退出条件if ((grid[colIdx][rawIdx] == 0) || ((modify == false) && (visited[colIdx][rawIdx] == true))) {return ;}// 递归visited[colIdx][rawIdx] = true;(*size)++;if (modify == true) {grid[colIdx][rawIdx] = 0;}if ((colIdx == 0) || (colIdx == (gridSize - 1)) || (rawIdx == 0) || (rawIdx == (gridColSize[colIdx] - 1))) {*island = true;}for (int k = 0; k < 4; k++) {int nextCol = colIdx + dir[k][0];int nextRaw = rawIdx + dir[k][1];// 越界if ((nextCol < 0) || (nextCol >= gridSize) || (nextRaw < 0) || (nextRaw >= gridColSize[nextCol])) {continue;}dfs(grid, gridSize, gridColSize, nextCol, nextRaw, visited, island, size, modify);}return ;
}void sunkenIsland(int **grid, int gridSize, int *gridColSize)
{bool **visited = (bool **)malloc(sizeof(bool *) * gridSize);memset(visited, 0, sizeof(bool *) * gridSize);for (int n = 0; n < gridSize; n++) {visited[n] = (char *)malloc(sizeof(char) * gridColSize[n]);memset(visited[n], 0, sizeof(char) * gridColSize[n]);}bool island = false;int size = 0;for (int i = 0; i < gridSize; i++) {for (int j = 0; j < gridColSize[i]; j++) {island = false;size = 0;dfs(grid, gridSize, gridColSize, i, j, visited, &island, &size, false);if ((island == false) && (size > 0)) {size = 0;dfs(grid, gridSize, gridColSize, i, j, visited, &island, &size, true);}}}for (int n = 0; n < gridSize; n++) {free(visited[n]);visited[n] = NULL;}free(visited);visited = NULL;return ;
}int main()
{// 输入int n = 0;int m = 0;scanf("%d %d\n", &n, &m);int gridSize = n;int **grid = (int **)malloc(sizeof(int *) * gridSize);memset(grid, 0, sizeof(int *) * gridSize);int *gridColSize = (int *)malloc(sizeof(int) * gridSize);memset(gridColSize, 0, sizeof(int) * gridSize);for (int i = 0; i < gridSize; i++) {grid[i] = (int *)malloc(sizeof(int) * m);memset(grid[i], 0, sizeof(int) * m);gridColSize[i] = m;int count = 0;char ch = 0;while (((ch = getchar()) != '\n') && (count < m)) {if (ch == ' ') {continue;}grid[i][count++] = ch - '0';}}// 处理sunkenIsland(grid, gridSize, gridColSize);// 输出for (int i = 0; i < gridSize; i++) {for (int j = 0; j < gridColSize[i]; j++) {printf("%d ", grid[i][j]);}printf("\n");}return 0;
}
BFS
// BFS#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>#define QUEUE_MAX_SIZE 2500int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};void bfs(int **grid, int gridSize, int *gridColSize, int colIdx, int rawIdx, bool **visited, bool *island, int *size, bool modify)
{// 退出条件if ((grid[colIdx][rawIdx] == 0) || ((modify == false) && (visited[colIdx][rawIdx] == true))) {return ;}// 队列int queue[QUEUE_MAX_SIZE][2];memset(queue, 0, sizeof(queue));int head = 0;int tail = 0;queue[tail][0] = colIdx;queue[tail][1] = rawIdx;tail++;visited[colIdx][rawIdx] = true;(*size)++;while (head != tail) {int curCol = queue[head][0];int curRaw = queue[head][1];head++;if (modify == true) {grid[curCol][curRaw] = 0;} else if ((curCol == 0) || (curCol == (gridSize - 1)) || (curRaw == 0) || (curRaw == (gridColSize[curCol] - 1))) {*island = true;}for (int k = 0; k < 4; k++) {int nextCol = curCol + dir[k][0];int nextRaw = curRaw + dir[k][1];// 越界if ((nextCol < 0) || (nextCol >= gridSize) || (nextRaw < 0) || (nextRaw >= gridColSize[nextCol])) {continue;}if ((grid[nextCol][nextRaw] == 0) || ((modify == false) && (visited[nextCol][nextRaw] == true))) {continue;}visited[nextCol][nextRaw] = true;queue[tail][0] = nextCol;queue[tail][1] = nextRaw;tail++;(*size)++;}}return ;
}void sunkenIsland(int **grid, int gridSize, int *gridColSize)
{bool **visited = (bool **)malloc(sizeof(bool *) * gridSize);memset(visited, 0, sizeof(bool *) * gridSize);for (int n = 0; n < gridSize; n++) {visited[n] = (char *)malloc(sizeof(char) * gridColSize[n]);memset(visited[n], 0, sizeof(char) * gridColSize[n]);}bool island = false;int size = 0;for (int i = 0; i < gridSize; i++) {for (int j = 0; j < gridColSize[i]; j++) {island = false;size = 0;bfs(grid, gridSize, gridColSize, i, j, visited, &island, &size, false);if ((island == false) && (size > 0)) {size = 0;bfs(grid, gridSize, gridColSize, i, j, visited, &island, &size, true);}}}for (int n = 0; n < gridSize; n++) {free(visited[n]);visited[n] = NULL;}free(visited);visited = NULL;return ;
}int main()
{// 输入int n = 0;int m = 0;scanf("%d %d\n", &n, &m);int gridSize = n;int **grid = (int **)malloc(sizeof(int *) * gridSize);memset(grid, 0, sizeof(int *) * gridSize);int *gridColSize = (int *)malloc(sizeof(int) * gridSize);memset(gridColSize, 0, sizeof(int) * gridSize);for (int i = 0; i < gridSize; i++) {grid[i] = (int *)malloc(sizeof(int) * m);memset(grid[i], 0, sizeof(int) * m);gridColSize[i] = m;int count = 0;char ch = 0;while (((ch = getchar()) != '\n') && (count < m)) {if (ch == ' ') {continue;}grid[i][count++] = ch - '0';}}// 处理sunkenIsland(grid, gridSize, gridColSize);// 输出for (int i = 0; i < gridSize; i++) {for (int j = 0; j < gridColSize[i]; j++) {printf("%d ", grid[i][j]);}printf("\n");}return 0;
}

今日收获

  1. 图的遍历:DFS、BFS

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

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

相关文章

探寻大模型回答9.9和9.11犯错的根本原因

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

每日OJ_牛客_排序子序列

目录 牛客_排序子序列 题解及代码 牛客_排序子序列 排序子序列_牛客笔试题_牛客网 题解及代码 本题依次比较整个数组 v[i1]>v[i] &#xff0c;则进入非递减序列判断&#xff0c;直到遍历到下一个值不大于等于为止count&#xff0c;然后进行下一位置的判断v[i1]<v[i]…

算法之判断对称二叉树

94. 二叉树的中序遍历101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;fa…

特斯拉新一代人形机器人Optimus二代:听说行走速度能够提升30%?

在当今这个快速变化的时代&#xff0c;人工智能已成为我们探索未来的一大驱动力。特斯拉以其在电动汽车领域的创新而闻名&#xff0c;而Optimus智能机器人的发布&#xff0c;更是将这种创新精神带到了一个新的领域 1. 智能机器人&#xff1a;Optimus的起源 2021年8月&#xff…

lua 游戏架构 之 TablePool`对象池

定义一个名 TablePool class&#xff0c;用于管理一个对象池。对象池是一种用于优化内存使用的技术&#xff0c;通过重用对象而不是频繁地创建和销毁对象&#xff0c;从而减少内存分配和垃圾回收的开销。 设计思路 1. **初始化**&#xff1a; - initialize 方法初始化对象…

虚拟摄像头怎么用?安卓虚拟相机替换本地摄像头教程(内含3个虚拟摄像头)

虚拟摄像头是一个软件摄像机&#xff0c;电脑没有物理摄像头时可以借助虚拟摄像头进行视频通话。当我们电脑没有自带的摄像头时&#xff0c;必须要外接摄像头才可以进行网络会议、视频直播。普通的摄像头像素不高&#xff0c;直接将手机充当电脑摄像头效果更佳哦。 虚拟摄像头我…

自动驾驶算法——Vehicle Control(一)

“ 在过去的几年里&#xff0c;无人驾驶汽车已成为人工智能领域的主要主力之一。鉴于交通死亡人数众多、老年人和残疾人的行动能力有限以及交通拥堵和拥堵问题日益严重&#xff0c;自动驾驶汽车有望解决我们社会最重要的问题之一&#xff1a;移动的未来。然而&#xff0c;让汽车…

Vue项目的构建方式

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

数学建模(1)

论文&#xff1a;做流程图 论文查重不能高于30% 论文 分模块备战 摘要不能超过一页的四分之三 数学建模的六个步骤: 【写作】---学术语言 团队练题

科普文:TaobaoVM信息收集

网上关于TaobaoVM的信息很少&#xff0c;只有一个简介&#xff0c;就没有其他信息。毕竟这是别人企业自己的jvm&#xff0c;不可能公开。 Taobao VM 由AliJVM团队发布。阿里&#xff0c;国内使用Java最强大的公司&#xff0c;覆盖云计算、金融、物流、电商等众多领域&#xf…

zabbix“专家坐诊”第246期问答

问题一 Q&#xff1a;有哪位大哥知道这是啥情况&#xff0c;6.4主动检查接口显示未知&#xff1f; A&#xff1a;看看agent配置文件的主采集有没有填写正确IP。 Q&#xff1a;我刚刚客户端重新授权&#xff0c;发现可以预警了&#xff0c;但是还是灰色的&#xff0c;我尝试输…

spring事件发布器ApplicationEventPublisher的使用

1、前言 spring中有一个事件发布器,使用了观察者模式,当有事件发布的时候,事件监听者会立刻收到发布的事件。今天我们来介绍下这个事件发布器怎么使用。 2、简单使用 2.1、创建事件实体类 事件实体类需要继承ApplicationEvent。我们模拟老师发布事件的诉求。 public class T…

【C++】C++ 学生信息管理系统(源码+面向对象)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

File Transfer Protocol(文件传输协议)(FTP)

FTP&#xff0c;全称File Transfer Protocol&#xff08;文件传输协议&#xff09;&#xff0c;是一种用于在网络上进行文件传输的标准协议&#xff0c;主要用于在不同主机之间上传和下载文件。FTP的设计目的是在不同类型的计算机系统之间提供一种可靠的文件传输服务。 FTP的工…

一文-深入了解Ansible常见模块、安装和部署

1 Ansible 介绍 Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的&#xff08;集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点&#xff09;自动化运维工具, 其功能实现基于ss…

鸿蒙仓颉语言【类型class】

类与结构&#xff08;class & struct&#xff09; 面向对象的编程语言&#xff0c;必不可少的基础元素&#xff0c;类或者叫类型&#xff0c;在仓颉中类可以抽象(abstract)、继承&#xff08;<:&#xff09;&#xff0c;公开&#xff08;Public&#xff09;或者私有&am…

算法第十天:leetcode203.移除链表元素

一、203.移除链表元素题目描述 203.移除链表元素的链接如下所示&#xff0c;您可复制下面链接网址进入力扣学习&#xff0c;看题解之前一定要先做一遍哦&#xff01; https://leetcode.cn/problems/remove-linked-list-elements/description/https://leetcode.cn/problems/rem…

26_EfficientNet网络详解

1.1简介 EfficientNet是由Google Research团队开发的一种高效卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;首次在2019年的论文《EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks》中提出。此模型设计的核心在于平衡网络的深度、宽度以…

如何规划数据科学和机器学习领域的下一步职业发展

。 欢迎来到云闪世界。数据科学和机器学习专业人士面临着来自多个方面的不确定性 欢迎来到云闪世界。全球经济、人工智能工具及其对工作保障的影响&#xff0c;以及不断变化的技术堆栈&#xff0c;仅举几例。如今&#xff0c;谈论职业生涯是否能够抵御经济衰退…

音频解码器音乐播放器

一、简介 1、Aimp 是两个俄罗斯程序员开发的音乐播放器。它的功能特别的强大&#xff0c;支持多种音频解码器&#xff0c;它还可以设置很多快捷键。还支持多种皮肤&#xff0c;还可以设置迷你播放器&#xff0c;特别的小巧。可以一键设置多个播放器&#xff0c;像浏览器那样。使…