目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、Java算法源码
- 五、效果展示
- 1、输入
- 2、输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有一个64x64的矩阵,每个元素的默认值为0,现在向里面填充数字,相同的数字组成一个实心图形,如下图所示是矩阵的局部(空白表示填充0)。
二、输入描述
- 第一行输入N,表示N个图形,N > 0且N < 64x64
- 矩阵左上角单元格坐标记作(0,0),第一个数字表示行号,第二个数字表示列号
- 接下来是N行,每行第一个数是矩阵单元格填充的数字,后续每两个一组,表示填充该数字的单元格坐标
- 答题者无需考虑数据格式非法的场景,题目用例不考察数据格式
- 题目用例保证同一个填充值只会有一行输入数据
三、输出描述
- 一共输出N个数值,每个数值表示某一行输入表示图形的周长
- 输出顺序需和输入的隔行顺序保持一致,即第1个数是输入的第1个图形的周长,第2个数是输入的第2个图形的周长,以此类推。
四、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest {
static int n = 64;
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int[][] arr2 = new int[n][n];
static List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// N个图形
int N = Integer.parseInt(sc.nextLine());
for (int i = 0; i < N; i++) {
String[] line = sc.nextLine().split(" ");
int first = Integer.parseInt(line[0]);
list.add(first);
for (int j = 1; j < line.length; j += 2) {
int x = Integer.parseInt(line[j]);
int y = Integer.parseInt(line[j + 1]);
arr2[x][y] = first;
}
}
// 周长之和
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr2[i][j] > 0) {
int value = arr2[i][j];
int res = 4;
for (int k = 0; k < 4; ++k) {
int nx = i + dx[k], ny = j + dy[k];
if (nx >= 0 && nx < n && ny >= 0 && ny < n && arr2[nx][ny] == value) {
res -= 1;
}
}
map.put(value, map.getOrDefault(value, 0) + res);
}
}
}
for (int i = 0; i < N; i++) {
System.out.print(map.get(list.get(i)));
if (i + 1 == N) {
System.out.println();
} else {
System.out.print(" ");
}
}
}
}
五、效果展示
1、输入
2
1 1 3 2 2 2 3 2 4 3 2 3 3 3 4 4 1 4 2 4 3 4 4 5 2 5 3
2 3 7 3 8 4 5 4 6 4 7 4 8 5 4 5 5 5 6 5 7 5 8 6 4 6 5 6 6 6 7 6 8 7 4 7 5 7 6 7 7 7 8
2、输出
18 20
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。