华为OD机试 - 图像物体的边界 - 深度优先搜索(Java 2024 D卷 200分)

在这里插入图片描述

华为OD机试 2024C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个物体2个物体相邻的格子为边界,求像素1代表的物体的边界个数。

像素1代表的物体的边界指与像素5相邻的像素1的格子,边界相邻的属于同一个边界,相邻需要考虑8个方向(上,下,左,右,左上,左下,右上,右下)。

其他约束:地图规格约束为:

0<M<100
0<N<100

在这里插入图片描述

二、输入描述

第一行,行数M, 列数N

第二行开始,是M行N列的像素的二维数组,仅包含像素1和5

三、输出描述

像素1代表的物体的边界个数。如果没有边界输出0(比如只存在像素1,或者只存在像素5)。

1、输入

6 6
1 1 1 1 1 1
1 5 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 5

2、输出

2

四、解题思路

  1. 对于矩阵中的每个像素1,如果它的8个方向(上、下、左、右、左上、左下、右上、右下)中至少有一个方向有像素5,则该像素1是边界的一部分。
  2. 对于每个标记为边界的像素1,使用DFS来标记与之相连的所有边界像素1,以确保每个边界只被计数一次。使用一个二维数组 visited 来记录哪些像素已经被访问过。
  3. 初始化边界计数为0。遍历二维数组中的每个元素,每当找到一个未访问过的边界像素1时,对它执行DFS并增加边界计数。
  4. 在DFS中,从当前像素开始,检查所有8个可能的方向,对于每个方向,如果是像素1且未被访问过,则递归调用DFS。
  5. 输出最终的边界计数。

五、Java算法源码

这段代码实现了上述算法,通过深度优先搜索标记和计数所有边界像素,最终打印边界的数量。注意在大型输入和边缘情况下测试以确保代码的鲁棒性。

public class OdTest02 {private static final int[] dx = {-1, -1, -1, 0, 0, 1, 1, 1};private static final int[] dy = {-1, 0, 1, -1, 1, -1, 0, 1};public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int M = scanner.nextInt();int N = scanner.nextInt();int[][] grid = new int[M][N];boolean[][] visited = new boolean[M][N];// 读取像素数据for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {grid[i][j] = scanner.nextInt();}}int boundaryCount = 0;// 遍历像素数组for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {if (grid[i][j] == 1 && !visited[i][j] && isBoundary(grid, i, j, M, N)) {// 执行DFS以标记所有相连的边界像素dfs(grid, visited, i, j, M, N);boundaryCount++;}}}System.out.println(boundaryCount);scanner.close();}// 判断是否为边界private static boolean isBoundary(int[][] grid, int x, int y, int M, int N) {for (int d = 0; d < 8; d++) {int nx = x + dx[d];int ny = y + dy[d];if (nx >= 0 && nx < M && ny >= 0 && ny < N && grid[nx][ny] == 5) {return true;}}return false;}// 深度优先搜索private static void dfs(int[][] grid, boolean[][] visited, int x, int y, int M, int N) {if (x < 0 || x >= M || y < 0 || y >= N || visited[x][y] || grid[x][y] != 1) {return;}visited[x][y] = true;if (!isBoundary(grid, x, y, M, N)) {return;}for (int d = 0; d < 8; d++) {int nx = x + dx[d];int ny = y + dy[d];dfs(grid, visited, nx, ny, M, N);}}
}

六、效果展示

1、输入

6 6
1 1 1 1 1 1
1 5 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 5 1
1 1 1 1 1 1

2、输出

1

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

栈的最小值

题目链接 栈的最小值 题目描述 注意点 执行push、pop和min操作的时间复杂度必须为O(1) 解答思路 使用两个栈&#xff0c;一个栈deque存储栈中对应的元素值&#xff0c;另一个栈minDeque存储当前栈中所有元素的最小值&#xff0c;当执行push(int x)操作&#xff0c;deque直…

2041:【例5.9】新矩阵

#include <iostream> using namespace std; int main(){const int N 21;//几行几列 int g[N][N] {};int n 0;cin >> n;for (int i 1; i < n; i){for (int j 1; j < n; j){// 输入到几行几列 cin >> g[i][j];if (i j || i j n 1){//如果是这种…

【计算机毕设】基于SpringBoot的民宿在线预定平台设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本研究旨在设计并实现一个基于SpringBoot的民宿在线预定平台。通过信息化手段提高民宿预定效率&#xff0c;方便用户查询房源、预定房间、在线支付和…

嵌入式Linux系统编程 — 1.2 文件管理与错误处理

目录 1 Linux 系统如何管理文件 1.1 什么是静态文件 1.2 扇区&#xff08;Sector&#xff09;和块&#xff08;Block&#xff09;概念&#xff1f; 1.3 inode 1.4 进程控制块&#xff08;PCB&#xff09; 2 返回错误处理与 errno 2.1 errno变量介绍 2.3 perror函数介绍…

pg 数据库,获取时间字段值的具体小时,赋值给其他字段

目录 1 问题2 实现 1 问题 pg 数据库&#xff0c;有一个表&#xff0c;其中有2个字段 一个是时间字段obstime &#xff0c;一个是时次ltime字段&#xff0c;int 类型&#xff0c;现在这个表里面是obstime 里面有数据&#xff0c;ltime字段 没有数据&#xff0c;现在就是批量获…

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(三)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失拖放取消的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…

EmotionPrompt 论文精读

EmotionPrompt: Leveraging Psychology for Large Language Models Enhancement via Emotional Stimulus 论文精读 核心观点&#xff1a; 提出 emotionprompt 作为一种利用情绪刺激来增强大语言模型性能的方式。该方法通过在原始提示中添加情绪刺激&#xff0c;例如“这对我的…

[每日一练]患某种疾病的患者,正则表达式的匹配

该题目来源于力扣&#xff1a; 1527. 患某种疾病的患者 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 患者信息表&#xff1a; Patients ----------------------- | Column Name | Type | ----------------------- | patient_id | int | | pati…

ZED-Mini提示“no GPU detected“错误解决

用ZEDm提示no GPU detected roslaunch zed_wapper zedm.launch的时候会提示no GPU detected 应该是nvidia GPU的问题&#xff0c;于是nvidia-smi检查是否正确安装&#xff0c;结果报错 Failed to initialize NVML: Driver/library version mismatch查了一些博客 解决Failed …

年中企业业绩管理新篇章:用友BIP收入云助力高效管理!

随着市场竞争的加剧&#xff0c;年中时刻对于企业而言&#xff0c;不仅是评估上半年业绩的节点&#xff0c;更是调整策略、确保全年目标达成的关键时期。高效的业绩管理不仅需要明确的目标设定和计划制定&#xff0c;更需要借助先进的信息技术工具来提升管理效率和决策质量。在…

Java项目:98 springboot在线教育系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统共有管理员、用户等角色 本在线教育系统管理员功能有个人中心&#xff0c;用户管理&#xff0c;讲师管理&#xff0c;普通管理员管理&#xff…

Qt开发技术:Q3D图表开发笔记(四):Q3DSurface三维曲面图颜色样式详解、Demo以及代码详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139424086 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子网络科技博…

334.递增的三元子序列

给你一个整数数组 nums &#xff0c;判断这个数组中是否存在长度为 3 的递增子序列。 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k &#xff0c;使得 nums[i] < nums[j] < nums[k]&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例…

Linux云计算架构师涨薪班课程内容包含哪些?

第一阶段&#xff1a;Linux云计算运维初级工程师 目标 云计算工程师&#xff0c;Linux运维工程师都必须掌握Linux的基本功&#xff0c;这是一切的根本&#xff0c;必须全部掌握&#xff0c;非常重要&#xff0c;有了这些基础&#xff0c;学习上层业务和云计算等都非常快&#x…

java异常习题

1.有关下述Java代码描述正确的选项是 public class TestClass {private static void testMethod(){System.out.println("testMethod");}public static void main(String[] args) {((TestClass)null).testMethod();}} A.编译不通过 B.编译通过&#xff0c;运行异常…

深入解析Java多线程:源码级别的分析与实践

Java的多线程机制是其并发编程的核心&#xff0c;对于高性能和高并发应用的开发至关重要。 一、Java多线程的基础 1.1 创建线程的几种方式 在Java中&#xff0c;有几种创建线程的方式&#xff1a; 继承Thread类&#xff1a; class MyThread extends Thread {public void run…

LangChain框架介绍

LangChain 的核心组件 模型 I/O 封装 LLMs&#xff1a;大语言模型Chat Models&#xff1a;一般基于 LLMs&#xff0c;但按对话结构重新封装PromptTemple&#xff1a;提示词模板OutputParser&#xff1a;解析输出 数据连接封装 Document Loaders&#xff1a;各种格式文件的加载…

指纹考勤系统

目录 1.课题研究目的和内容 1.1 课题研究目的 1.2 课题研究内容 2.系统总体方案设计及功能模块介绍 2.1总体方案设计 2.2 ATK-301模块介绍 2.3 TFTLCD显示功能模块介绍 2.4 蜂鸣器报警功能模块介绍 2.5 时钟模块介绍 3.系统硬件设计与实现 3.1 系统硬件电…

控制应优先

先从大体上的去找规律&#xff0c;然后才是数字归纳&#xff08;更为详细的&#xff09;&#xff0c;同时控制关系应该优先&#xff08;这里是天数和位置&#xff09;。是否涉及所有对象不是广泛&#xff0c;如果是具体的数值就不是广泛。

指针的认识(传值调用和传地址调用)

学习指针的目的是使用指针解决问题&#xff0c;那什么问题&#xff0c;非指针不可呢&#xff1f; 当要求写个函数来交换两个变量的值时&#xff0c;我们稍加思索&#xff0c;可以写成如下函数&#xff1a; void Swap1(int x, int y) {int tmp x;x y;y tmp; } 那么我们来进…