2023华为OD机试 (B卷)|200分图像物体的边界(Java JavaScript C++ Python)
题目描述
给定一个二维数组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,2)(4,4)(4,5)(5,4)
为边界,另(0,0)(0,1)(0,2)(1,0)(1,2)(2,0)(2,1)(2,2)
相邻,为1
个边界,(4,4)(4,5)(5,4)
相邻,为1个边界,所以下图边界个数为2
。
1 | 1 | 1 | 1 | 1 | 1 |
1 | 5 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 |
5 | 1 | 1 | 1 | 1 | 1 |
5 | 1 | 1 | 1 | 1 | 1 |
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,2)(3,3)相邻
输入描述
第一行,行数M,列数N。
第二行开始,是M行N列的像素的二维数组,仅包含像素1和5
输出描述
像素1代表的物体的边界个数。
如果没有边界输出0(比如只存在像素1,或者只存在像素5)
用例
输入 | 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 1 |
---|---|
输出 | 2 |
说明 | 参考题目描述部分 |
输入 | 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 |
说明 | 参考题目描述部分 |
Java
import java.util.*;
class Main {
static class UnionFindSet {
int[] fa;
int count;
public UnionFindSet(int n) {
fa = new int[n];
for (int i = 0; i < n; i++) {
fa[i] = i;
}
count = n;
}
public int find(int x) {
if (x != fa[x]) {
fa[x] = find(fa[x]);
}
return fa[x];
}
public void union(int x, int y) {
int x_fa = find(x);
int y_fa = find(y);
if (x_fa != y_fa) {
fa[y_fa] = x_fa;
count--;
}
}
}
public static int getBoundaryCount(int[][] matrix, int m, int n) {
List<int[]> brands = new ArrayList<>(); // 存储像素为5的格子的坐标
// 找到所有像素为5的格子
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 5) {