题目描述
某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:
给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器
输入描述
第一行输入m,n表示长宽,满足1 < m,n <= 20;
后面输入m行,每行有n个0或1的整数,整数间使用一个空格隔开,表示该行已停车情况,其中0表示空位,1表示已停:
输出描述
最少需要打开监控器的数量
示例1:
输入
3 3
0 0 0
0 1 0
0 0 0
输出
5
说明
中间1的位置上需要打开监视器,且其上下左右皆需要打开监视器,共5个。
解题思路
根据题目我们知道为1的位置表示该位置停了车,当前位置以及上下左右四个位置的监控都需要打开,最简单的想法就是遍历所有车位,当发现为1时,我们创建一个同样的车位数组,该位置需要的监控都打开,最后遍历统计打开的监控即可。
代码实现
import java.util.Scanner;
public class B_1 {
public static int[][] directions={{-1,0},{1,0},{0,1},{0,-1}};
//四行两列
public static void main(String[] args){
Scanner scn=new Scanner(System.in);
int m=scn.nextInt();
int n=scn.nextInt();
int[][] matrix=new int[m][n];
int monitor=0;
// System.out.println(m+" "+n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
matrix[i][j]=scn.nextInt();
}
}
for(int x=0;x<m;x++){
for(int y=0;y<n;y++){//判断是否为1,即是否有停车
if(matrix[x][y]==1){
monitor++;
continue;
}
for(int i=0;i<4;i++){ //需要理解
int new_x=x+directions[i][0];
int new_y=y+directions[i][1];
if(new_x>=0&&new_x<m&&new_y>=0&&new_y<n&&matrix[new_x][new_y]==1){
monitor++;
break;
}
}
}
}
scn.close();
System.out.println(monitor);
}
}