1.题目
某长方形停车场,每个车位上方都有对应 监控器Q,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:
给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器
输入描述:
第一行输入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的位置上需要打开 监视器Q,且其上下左右皆需要打开监视器,共5个。
2.解题思路
这个问题要求你统计在一个长方形停车场中,最少需要打开多少个监控器,以便覆盖所有已停车位的情况。监控器只需要在当前车位或者其上下左右四个相邻的车位范围内打开。
解题思路如下:
-
遍历整个停车场的每个位置,当你找到一个已停车(值为1)的位置时,表示需要放置一个监控器。
-
一旦找到一个已停车的位置,你需要确保其上下左右四个相邻的位置也被覆盖。所以,你需要标记这些相邻位置为已覆盖。
-
继续遍历停车场,如果你找到一个已停车的位置,但它已经被之前的监控器覆盖了,那么无需再放置一个监控器。
-
统计放置的监控器数量。
3.代码实现
def min_cameras(m, n, parking_lot):def is_valid(x, y):return 0 <= x < m and 0 <= y < n# 定义上下左右四个方向的偏移量directions = [(0, 0), (0, 1), (1, 0), (0, -1), (-1, 0)]cameras = [[0] * n for _ in range(m)] # 创建一个二维数组来标记放置监控器的位置count = 0 # 统计监控器数量for i in range(m):for j in range(n):if parking_lot[i][j] == 1:for dx, dy in directions:nx, ny = i + dx, j + dyif is_valid(nx, ny):cameras[nx][ny] = 1 # 标记相邻位置为已覆盖# 统计放置的监控器数量for i in range(m):for j in range(n):if cameras[i][j] == 1:count += 1return count# 读取输入
m, n = map(int, input().split())
parking_lot = []
for _ in range(m):row = list(map(int, input().split()))parking_lot.append(row)result = min_cameras(m, n, parking_lot)
print(result)
这段代码首先遍历停车场中的每个位置,找到已停车的位置,并标记其上下左右相邻的位置为已覆盖。然后,统计放置的监控器数量。最后,输出结果表示最少需要打开多少个监控器来覆盖所有已停车位的情况。