代码随想录算法训练营第五十一天|Day51 图论

岛屿数量 深搜

https://www.programmercarl.com/kamacoder/0099.%E5%B2%9B%E5%B1%BF%E7%9A%84%E6%95%B0%E9%87%8F%E6%B7%B1%E6%90%9C.html

思路

#include <stdio.h>
#define MAX_SIZE 50
int grid[MAX_SIZE][MAX_SIZE]; 
int visited[MAX_SIZE][MAX_SIZE]; 
int N, M; 
int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
void DFS(int x, int y) {visited[x][y] = 1; for (int i = 0; i < 4; i++) {int newX = x + directions[i][0];int newY = y + directions[i][1];if (newX >= 0 && newX < N && newY >= 0 && newY < M && grid[newX][newY] == 1 && !visited[newX][newY]) {DFS(newX, newY);}}
}
int main() {scanf("%d %d", &N, &M);for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {scanf("%d", &grid[i][j]);visited[i][j] = 0; }}int islandCount = 0; for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {if (grid[i][j] == 1 && !visited[i][j]) {DFS(i, j); islandCount++; }}}printf("%d\n", islandCount);return 0;
}

学习反思

用深度优先搜索算法(Depth-First Search, DFS)求解岛屿数量的程序。代码使用一个二维数组grid来表示一个由0和1组成的地图,其中1表示陆地,0表示水。代码中的visited数组用于记录每个格子是否被访问过。主要的算法逻辑在DFS函数中实现。DFS函数会将当前格子标记为已访问,然后递归地对当前格子的上、下、左、右四个邻居格子进行访问,如果邻居格子满足一些条件(在地图范围内且为1且未被访问过),则继续递归访问邻居格子。通过递归的方式,DFS函数可以遍历到所有与当前格子相连的陆地格子。在主函数中,首先读取地图的行数N和列数M。然后使用两个嵌套循环遍历地图中的所有格子,并读取每个格子的值并初始化visited数组。接下来,使用两个嵌套循环遍历地图中的所有格子。如果发现一个未访问过的陆地格子,就调用DFS函数进行访问,并将岛屿数量加1。最后,输出岛屿数量。这段代码的时间复杂度为O(NM),其中N和M分别为地图的行数和列数。代码中使用了递归,递归深度最大为NM,空间复杂度为O(N*M)。

岛屿数量 广搜

https://www.programmercarl.com/kamacoder/0099.%E5%B2%9B%E5%B1%BF%E7%9A%84%E6%95%B0%E9%87%8F%E5%B9%BF%E6%90%9C.html

思路

#include <stdio.h>#define MAX 50int grid[MAX][MAX];
int visited[MAX][MAX];
int n, m;
int directions[4][2] = {{-1, 0},  // 上{1, 0},   // 下{0, -1},  // 左{0, 1}    // 右
};
void dfs(int x, int y) {visited[x][y] = 1;for (int i = 0; i < 4; i++) {int newX = x + directions[i][0];int newY = y + directions[i][1];if (newX >= 0 && newX < n && newY >= 0 && newY < m && grid[newX][newY] == 1 && visited[newX][newY] == 0) {dfs(newX, newY);}}
}int main() {scanf("%d %d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &grid[i][j]);visited[i][j] = 0; }}int islandCount = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 1 && visited[i][j] == 0) {dfs(i, j); islandCount++; }}}printf("%d\n", islandCount);return 0;
}

学习反思

用深度优先搜索算法(DFS)来解决岛屿数量的问题。代码将二维数组grid用于表示地图,其中1表示陆地,0表示水。visited数组用于标记格子是否被访问过。主要的算法逻辑在dfs函数中实现。dfs函数会将当前格子标记为已访问,然后递归地访问当前格子的上、下、左、右四个邻居格子。如果邻居格子满足一些条件(在地图范围内且为1且未被访问过),则继续递归地访问邻居格子。通过递归的方式,dfs函数可以遍历到所有与当前格子相连的陆地格子。在主函数中,首先读取地图的行数n和列数m。然后使用两个嵌套循环遍历地图中的所有格子,并读取每个格子的值并初始化visited数组。接下来,使用两个嵌套循环遍历地图中的所有格子。如果发现一个未访问过的陆地格子,就调用dfs函数进行访问,并将岛屿数量加1。最后,输出岛屿数量。这段代码的时间复杂度为O(nm),其中n和m分别为地图的行数和列数。代码中使用了递归,递归深度最大为nm,空间复杂度为O(n*m)。

岛屿的最大面积

https://www.programmercarl.com/kamacoder/0100.%E5%B2%9B%E5%B1%BF%E7%9A%84%E6%9C%80%E5%A4%A7%E9%9D%A2%E7%A7%AF.html

思路

#include <stdio.h>#define MAX_N 50
#define MAX_M 50int grid[MAX_N][MAX_M];
int visited[MAX_N][MAX_M];
int N, M;
int directions[4][2] = {{0, 1},   // right{1, 0},   // down{0, -1},  // left{-1, 0}   // up
};
int is_valid(int x, int y) {return x >= 0 && x < N && y >= 0 && y < M && grid[x][y] == 1 && !visited[x][y];
}
int dfs(int x, int y) {visited[x][y] = 1;int area = 1;for (int i = 0; i < 4; i++) {int new_x = x + directions[i][0];int new_y = y + directions[i][1];if (is_valid(new_x, new_y)) {area += dfs(new_x, new_y);}}return area;
}
int main() {scanf("%d %d", &N, &M);for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {scanf("%d", &grid[i][j]);visited[i][j] = 0; }}int max_area = 0;for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {// If we find a land cell that hasn't been visited yetif (grid[i][j] == 1 && !visited[i][j]) {int area = dfs(i, j);if (area > max_area) {max_area = area;}}}}  printf("%d\n", max_area);return 0;
}

学习反思

使用深度优先搜索算法(DFS)来计算最大岛屿面积。首先,定义了最大行数N和最大列数M,并声明了地图数组grid和访问数组visited。is_valid函数用于判断一个格子是否有效,即格子的坐标在合法范围内,且为陆地(值为1),且未被访问过。dfs函数用于进行深度优先搜索。它首先将当前格子标记为已访问,并初始化面积为1。然后,遍历当前格子的四个方向的邻居格子,如果邻居格子有效,则递归调用dfs函数,并将返回的面积加到当前面积上。最后,返回当前面积。在主函数中,首先读取地图的行数N和列数M。然后,使用两个嵌套循环遍历地图中的所有格子,并读取每个格子的值并初始化visited数组。接下来,使用两个嵌套循环遍历地图中的所有格子。如果发现一个未访问过的陆地格子,就调用dfs函数进行深度优先搜索,并将返回的面积与最大面积进行比较,更新最大面积。最后,输出最大面积。这段代码的时间复杂度为O(NM),其中N和M分别为地图的行数和列数。代码中使用了递归,递归深度最大为NM,空间复杂度为O(N*M)。为了提高效率,使用了is_valid函数来判断格子的有效性,避免了不必要的访问和递归调用。

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

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

相关文章

HCIP --OSI七层参考模型回顾、TCP/UDP协议复习

目录 一、OSI 二、重要的三个协议报头格式 名词注解 MTU 封装 解封装 PDU ARP DNS TCP/IP与OSI的区别 三、数据包转发过程 四、获取目标ip地址方式 五、获取目标mac地址方式 六、交换机的工作原理 七、TCP/UDP TCP&#xff08;Transmission Control Protocol&a…

ORIN NX 16G安装中文输入法

刷机版本为jetpack5.14.刷机之后预装了cuda、cudnn、opencv、tensorrt等&#xff0c;但是发现没有中文输入&#xff0c;所以记录一下安装流程。 jetson NX是arm64架构的&#xff0c;sougoupinyin只支持adm架构的&#xff0c;所以要选择安装Google pinyin 首先打开终端&#x…

解决背景图因为图片路径中携带括号导致图片无法显示的问题

本人是在uniapp中写微信小程序遇到了这个问题&#xff0c;调用后端接口传来的数据&#xff0c;发现有些背景图能正常显示&#xff0c;但有些不能&#xff0c;最后发现问题是因为路径地址携带了()的原因 如下&#xff1a; 注&#xff1a;该地址无法正常访问&#xff0c;放在这只…

Node == Sequelize 使用文档

目录 1. 简介 2. 安装 3. 连接到数据库 4. 测试连接 5. 关闭连接 6. 模型&#xff08;Model&#xff09; define.sync({ force: true }); belongsTo paranoid 7. 增删改查&#xff08;CRUD&#xff09; 7.1 查询&#xff08;Query&#xff09; 7.2 插入&#xff08;…

2411rust,1.75.0

原文 Rust团队很高兴地声明推出Rust的新版本1.75.0. 如果你rustup安装了以前版本的Rust,你可如下取1.75.0: $ rustup update stable1.75.0稳定版中的功能 async fn和特征中的返回位置impl Trait. 指针字节偏移API 原始指针(*const T和*mutT)过去主要支持,T为单位的操作.如…

物联网智能技术的深入探讨与案例分析

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程

环境&#xff1a; keil版本为5.38&#xff0c;版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址&#xff1a;https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译&#xff0c;会报很多错&#xff0c;先不管。 二、更改头文件依赖 观察…

9.《滑动窗口篇》---①长度最小的子数组(中等)

滑动窗口推导过程 我们不能说一上来就知道这个题目用滑动窗口&#xff0c;然后就使用滑动窗口的方法来做这个题目。 首先我们想到的应该是暴力解法。 接着再优化为滑动窗口 由于数字都是 ≥ 0 的数。因此累加的数越多。和越大。 因此right往后遍历的时候。当发现sum > targe…

Marin说PCB之电源完整性之电源网络的PDN仿真CST---04

小编我最近都要忙疯了&#xff0c;好不容易去韩国出个差&#xff0c;打算不忙的时候去首尔看看韩国的美女们&#xff0c;说错了&#xff0c;是看美景啊。谁料想韩国分公司的SI同事的李相赫同志由于结婚请假了一个多月啊&#xff0c;他倒是挺爽啊&#xff0c;和老婆去度蜜月了&a…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述&#xff1a;在我向远程仓库push代码时&#xff0c;即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因&#xff1a; 在网上查了许多资料&#xff0c;是因为Git仓库中已经有一部分代码&#xff0c;它不允许你直接把你的代码覆盖上去…

Vite 基础理解及应用

文章目录 概要Vite基础知识点1. 快速启动和热更新热更新原理 2. 基于ES模块的构建3. 对不同前端框架的支持 vite.config.js配置实例1. 基本结构2. 服务器相关配置3. 输入输出路径配置4. 打包优化配置 项目构建一、项目初始化二、项目结构理解三、CSS处理四、静态资源处理五、构…

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟&#xff0c;不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面&#xff0c;很多运维人员都更熟悉虚拟化环境&#xff0c;对“容器圈”的各种概念容易混淆&#xff1a;容器就是 Kubernetes 吗&#xff1f;容器云又是什么&#xff1f;容器…

【Android】线程池的解析

引言 在Android当中根据用途分为主线程与子线程&#xff0c;主线程当中主要处理与界面相关的操作&#xff0c;子线程主要进行耗时操作。除了Thread本身以外&#xff0c;在Android当中还有很多扮演者线程的角色&#xff0c;比如AsyncTask&#xff08; 底层为线程池&#xff0c;…

本地音乐服务器(三)

6. 删除音乐模块设计 6.1 删除单个音乐 1. 请求响应设计 2. 开始实现 首先在musicmapper新增操作 Music findMusicById(int id);int deleteMusicById(int musicId); 其次新增相对应的.xml代码&#xff1a; <select id"findMusicById" resultType"com.exa…

设计模式的基本概述

一.什么是设计模式 1.设计模式(Design Pattern)是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路&#xff0c;它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案 。 2.1995 年&#xff0c;GoF(Gang…

Rust:AtomicI8 还是 Mutex<u8>?

问题1&#xff1a; 选择 AtomicI8 还是 Mutex<u8>? 在比较AtomicI8和Mutex时&#xff0c;我们需要考虑多个方面&#xff0c;包括性能、使用场景、以及它们各自的特点。以下是对这两者的详细比较&#xff1a; 一、性能 AtomicI8&#xff1a; 使用CPU级别的原子操作&…

Spring Boot图书馆管理系统:疫情中的管理利器

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫情下图书馆管理系统的方案。文章介绍了疫情下图…

集群聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…

Linux第93步_Linux内核的LED灯驱动

Linux内核的LED灯驱动采用platfomm框架&#xff0c;因此我们只需要按照要求在“设备树文件”中添加相应的LED节点即可。 1 、通过“linux内核图形化配置界面”令“CONFIG_LEDS_GPIOy” 1)、打开终端&#xff0c;输入“cd linux/atk-mp1/linux/my_linux/linux-5.4.31/回车”&a…