题目:
某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开
给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器;
输入描述:
第一行输入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
示例2:
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3 4
0 0 0 0
0 1 0 1
0 0 0 0
输出
8
解题思路:
1、0代表空车位,1代表停车,假定2代表监控器;
2、采用广度优先算法bps,遍历前后左右四个方向,如果不是四个方向没有停车(即!= 1),设置监控器(设置成2),并把当前车位也设置监控器(设置成2);
3、最后遍历数组,统计监控器数量(数组为2的个数)。
代码
C
#include <stdio.h>
int row,col;
int bps(int (*arr)[col],int rs,int cs){
//right
if(cs + 1 < col && arr[rs][cs + 1] != 1){
arr[rs][cs + 1] = 2;
}
//down
if(rs + 1 < row && arr[rs + 1][cs] != 1){
arr[rs + 1][cs] = 2;
}
//left
if(cs - 1 >= 0 && arr[rs][cs - 1] != 1){
arr[rs][cs - 1] = 2;
}
//up
if(rs - 1 >= 0 && arr[rs - 1][cs] != 1){
arr[rs - 1][cs] = 2;
}
}
int main(){
int i,j;
scanf("%d %d",&row,&col);
int arr[row][col];
for(i = 0;i < row;i++){
for(j = 0;j < col;j++){
scanf("%d",&arr[i][j]);
}
}
for(i = 0;i < row;i++){
for(j = 0;j < col;j++){
if(arr[i][j] == 1){
arr[i][j] = 2;
bps(arr,i,j);
}
}
}
int cnt = 0;
for(i = 0;i < row;i++){
for(j = 0;j < col;j++){
if(arr[i][j] == 2){
cnt++;
}
}
}
printf("%d",cnt);
}
python
m,n = map(int,input().split())
matrix = [list(map(int,input().split())) for _ in range(m)]
def getresult():
# 计数
cnt = 0
# 上下左右偏移
offset = ((-1,0),(1,0),(0,-1),(0,1))
#循环每一个车位
for i in range(m):
for j in range(n):
# 车位上有车,加个监视器,开始下一层循环
if matrix[i][j] == 1:
cnt += 1
continue
# 车位上没有车,遍历上下左右是否有车,任一个方向有车加个监视器,退出,避免重复加监视器
for x,y in offset:
mx = x + i
ny = y + j
if 0 <= mx < m and 0 <= ny < n and matrix[mx][ny] == 1:
cnt += 1
break
print(cnt)
getresult()