OD机试 - 图像物体的边界 - 深度优先搜索

题目

给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个物体,2个物体相邻的格子为边界,求像素1代表的物体的边界个数。
像素1代表的物体的边界指与像素5相邻的像素1的格子,边界相邻的属于同一个边界,相邻需要考虑8个方向(上,下,左,右,左上,左下,右上,右下)。
其他约束
地图规格约束为:
0<M<100
0<N<100
如下图,与像素5的格子相邻的像素1的格子(0,0)、(0,1)、(0,2)、(1,0)、(1,2)、(2,0)、(2,1)、(2,2)、(4,4)、(4,5)、(5,4)相邻,为1个边界,(4,4)、(4,5)、(5,4)相邻,为1个边界
在这里插入图片描述

输入输出说明

输入:
第一行,行数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. 对于矩阵中的任一元素,它的上、下、左、右、左上、左下、右上、右下)中至少有一个方向有像素5,则该元素是边界的一部分。
  2. 若该元素是边界的一部分,则继续探索涉及的八个方向,将是边界的元素都加以标记
  3. 标记完成后,所以的边界必然是相连接的,所以每个边界元素的上下左右必然有至少一个连接

代码

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
 * @Desc:
 * @Auther:chenShunGuo
 * @Date: 2024/6/4 14:36
 */
public class Test021 {
   
    /*
    * 探索边界的方向
    * */
    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};
    /*
    * 探索边界路径的方向
    * */
    private static final int[] BOUNDARY_X = {
   1, -1,  0, 0};
    private static final int[] BOUNDARY_Y = {
   0, 0,  
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值