问题描述:
设某住宿区域是一个n×n的方阵,方阵中的每个小方格为一个房间,房间里可能住一个人,也可能空着。第一天,某些房间中住着的人得了一种高传染性的流感,以后每一天,得流感的人会使其邻居(住在其上、下、左、右方向存在的房间里面的人)传染上流感,请问:第m天总共有多少人得流感?
输入格式:
第一行输入两个整数n,m(1<n≤20,1≤m≤100),含义如上述;接着输入n行,每行n个字符,表示住宿区域第一天的房间情况,其中,@
表示当天该房间住着得流感的人,.
表示该房间住着健康的人,#
表示该房间是空的。
输出格式:
输出一个整数,表示第m天得了流感的人数。
输入样例1:
5 3
#....
.....
...##
.#.@.
@.#..
输出样例1:
10
输入样例2:
5 4
....#
.#.@.
.#@..
#....
.....
输出样例2:
16
代码实现:
def count_infected_people(n, m, grid):
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
def is_valid(x, y):
return 0 <= x < n and 0 <= y < n
def spread_infection(day, current_grid):
new_infected = set()
for i in range(n):
for j in range(n):
if current_grid[i][j] == '@':
for dx, dy in directions:
nx, ny = i + dx, j + dy
if is_valid(nx, ny) and current_grid[nx][ny] == '.':
new_infected.add((nx, ny))
for x, y in new_infected:
current_grid[x][y] = '@'
return current_grid
for _ in range(m - 1):
grid = spread_infection(_, grid)
return sum(row.count('@') for row in grid)
n, m = map(int, input().split())
initial_grid = [list(input().strip()) for _ in range(n)]
result = count_infected_people(n, m, initial_grid)
print(result)
代码思路:
首先,定义了四个方向(上、下、左、右)的坐标增量。然后,定义了一个函数is_valid
对坐标的合法性进行了判断,确保不会出现越界访问,避免了在地图矩阵边缘造成数组越界的问题。
接下来,定义了一个名为spread_infection
的函数,它接收当前的天数和当前的地图矩阵作为参数。该函数会遍历整个地图矩阵,找到所有已感染的人,并将其周围未感染的人加入到新感染人群中。最后,将新感染人群更新到当前地图矩阵中,并返回更新后的地图矩阵。
在主函数中,使用循环来模拟多天的感染过程。每一天都调用spread_infection
函数来更新地图矩阵,直到达到指定的天数。最后,通过统计地图矩阵中感染人数(即@符号的数量)来得到最终的结果,并将其打印出来。
注意:程序中使用了map(int, input().split())
来获取输入的n和m,以及通过循环和列表推导式获取了初始地图矩阵。因此,在实际使用时,需要确保输入的格式符合预期,并且需要提供有效的地图矩阵来进行感染模拟。