华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
在一长方形停车场内,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开。给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器。
二、输入描述
第一行输入 m,n 表示长宽,满足 1 < m, n <= 20;
后面输入 m 行,每行有 n 个 0 或 1 的整数,整数间使用一个空格隔开,表示该行停车情况,其中 0 表示空位,1 表示已停。
三、输出描述
最少需要打开监控器的数量。
四、测试用例
1、输入
3 3
0 0 0
0 1 0
0 0 0
2、输出
5
五、解题思路
对于每一个车位,检查其自身和四个相邻方向的车位是否有车辆停放(即是否有 1)。
如果满足条件,则计数该监控器需要开启。
在检查相邻车位时,需要确保不超出矩阵的边界,以避免数组越界错误。
六、Java算法源码
public class OdTest01 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {// 读取第一行,获取m和nif (!scanner.hasNextLine()) {System.out.println("-1");return;}String firstLine = scanner.nextLine().trim();String[] mn = firstLine.split(" ");if (mn.length != 2) { // 确保有两个数字System.out.println("-1");return;}int m = Integer.parseInt(mn[0]);int n = Integer.parseInt(mn[1]);// 验证m和n的范围if (m <=1 || m >20 || n <=1 || n >20) {System.out.println("-1");return;}// 初始化停车场二维数组int[][] parkingLot = new int[m][n];for (int i =0; i <m; i++) {if (!scanner.hasNextLine()) { // 检查是否有足够的停车分布行System.out.println("-1");return;}String rowLine = scanner.nextLine().trim();String[] rowStr = rowLine.split(" ");if (rowStr.length != n) { // 每行必须有n个车位System.out.println("-1");return;}for (int j =0; j <n; j++) {int val = Integer.parseInt(rowStr[j]);if (val !=0 && val !=1) { // 验证车位值System.out.println("-1");return;}parkingLot[i][j] = val;}}int cameraCount =0; // 初始化监控器开启数量// 定义四个方向:上、下、左、右int[][] directions = {{-1, 0}, // 上{1, 0}, // 下{0, -1}, // 左{0, 1} // 右};// 遍历每个车位for (int i =0; i <m; i++) {for (int j =0; j <n; j++) {if (parkingLot[i][j] ==1) {cameraCount +=1; // 当前车位有车辆,监控器需要开启}else {// 检查四个相邻方向for (int[] dir : directions) {int ni = i + dir[0];int nj = j + dir[1];// 确保相邻车位在矩阵范围内if (ni >=0 && ni <m && nj >=0 && nj <n) {if (parkingLot[ni][nj] ==1) {cameraCount +=1; // 相邻车位有车辆,监控器需要开启break; // 只需满足一个方向即可,跳出循环}}}}}}// 输出监控器开启数量System.out.println(cameraCount);} catch (Exception e) {// 捕获任何异常,输出-1System.out.println("-1");} finally {scanner.close(); // 关闭扫描器}}
}
七、效果展示
1、输入
3 3
1 0 0
0 1 0
0 0 0
2、输出
6
3、说明
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。