华为机考--需要打开多少监控器【答案和详细思路】

题目描述:
某长方形停车场每个车位上方都有一个监控器。只有当当前车位或者前后左右四个方向任意一个车位范围停有车时,监控器才需要打开。给定某一时刻停车场的停车分布,请统计最少需要打开多少个监控器。

输入描述:
第一行输入m和n,表示停车场的长和宽。满足条件1 < m, n <= 20。
接下来的m行,每行包含n个整数(0或1),表示该行停车位的情况。其中0表示空位,1表示已停车。

输出描述:
输出最少需要打开的监控器数量。

import java.util.Scanner;
 
public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    int m = sc.nextInt();
    int n = sc.nextInt();
 
    int[][] matrix = new int[m][n];
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        matrix[i][j] = sc.nextInt();
      }
    }
 
    System.out.println(getResult(m, n, matrix));
  }
 
  public static int getResult(int m, int n, int[][] matrix) {
    int count = 0;
    int[][] offsets = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
 
    for (int x = 0; x < m; x++) {
      for (int y = 0; y < n; y++) {
        if (matrix[x][y] == 1) {
          count++;
          continue;
        }
 
        for (int[] offset : offsets) {
          int newX = x + offset[0];
          int newY = y + offset[1];
 
          if (newX >= 0 && newX < m && newY >= 0 && newY < n && matrix[newX][newY] == 1) {
            count++;
            break;
          }
        }
      }
    }
 
    return count;
  }
}

代码思路详解:
华为机考--需要打开多少监控器【答案和详细思路】_第1张图片

你可能感兴趣的:(华为,算法,数据结构)