【代码随想录】【算法训练营】【第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…

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

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

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

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

一文-深入了解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;谈论职业生涯是否能够抵御经济衰退…

MySQL 进阶(三)【SQL 优化】

1、SQL 优化 1.1、插入数据优化 1.1.1、Insert 优化 1、批量插入 插入多条数据时&#xff0c;不建议使用单条的插入语句&#xff0c;而是下面的批量插入&#xff1a; INSERT INTO tb_name VALUES (),(),(),...; 批量插入建议一次批量 500~100 条&#xff0c;如果数据量比…

GNN学习笔记

1.拉普拉斯矩阵 D是度矩阵&#xff0c;A是邻接矩阵 L的第二个公式常用 L的特征值>0 2.图的整体&#xff0c;节点&#xff0c;边都能代表一个分类/回归问题。 3.GNN的感受野 N-Hop Neighbors&#xff0c;某一点的n阶邻居。n步以内能到达的点。 4.残差连接 最后对图结果的处…

RK3568笔记三十六:LED驱动开发(设备树)

若该文为原创文章&#xff0c;转载请注明原文出处。 记录使用设备树编写一个简单的 LED 灯驱动程序 一、编程思路 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的 属性&#xff0c;编写测试应用程序。 • 首先向设备树添加 LED 设备…

SCSA第八天

防火墙的带宽管理 核心思想 1&#xff0c;带宽限制 --- 限制非关键业务流量占用带宽的比例 2&#xff0c;带宽保证 --- 这里需要保证的是我们关键业务流量&#xff1b;再业务繁忙时&#xff0c;确保关键业务不受影 响&#xff1b; 3&#xff0c;连接数的限制 --- 这也…