PTA 感染人数

问题描述:

        设某住宿区域是一个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,以及通过循环和列表推导式获取了初始地图矩阵。因此,在实际使用时,需要确保输入的格式符合预期,并且需要提供有效的地图矩阵来进行感染模拟。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值