用python解决流感传染问题

问题:

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

输入:

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100。

输出:

输出第m天,得流感的人数。

思路:本题目思路是利用二维数组储存每个房间居住的是什么类型的人,很容易可以得到矩阵中a[i][j]的上下左右元素分别是:a[i-1][j](上)、a[i+1][j](下)、a[i][j-1](左)、a[i][j+1](右)。如此以来我们去判断一个房间的上下左右有没有人感染就可以知道下一天这个房间的人会不会被感染了,这个时候我们要去考虑到数组长度溢出的问题,当你判断第a[i][j]个房间的时候会需要用到a[i+1][j]和a[i][j+1]的数据,当你判断a[0][0]的时候又会用到a[0-1][0]和a[0][0-1]这两个数据,所以我们在去用二维数组储存数据的时候需要把这个点考虑进去,需要在我们输入的数据周围增加一圈数据用于解决长度溢出的问题,剩下的就很简单了,直接用我们已知的这些条件去判断就行了。

代码如下:

n = int(input("请输入n"))

nums=[[0 for x in range(n+2)]for y in range(n+2)]

for i in range(n):

    #矩阵中a[i][j]的上下左右元素分别是:

    # a[i-1][j](上)、a[i+1][j](下)

    # a[i][j-1](左)、a[i][j+1](右)。

    num = list(map(str,input("请输入第%d行字符"%(i+1)).split()))

    nums[i+1]=num

    nums[i+1].insert(0,"0")

    nums[i+1].append("0")

    num=[]

print(nums)

m = int(input("请输入天数"))

def aa(nums,m):

    if m==1:

         return nums

    else:

        for im in range(1,n+1):

            for j in range(1,n+1):

                if nums[im][j]==".":

                    if nums[im-1][j]=="@" or nums[im+1][j]=="@" or nums[im][j-1]=="@" or nums[im][j+1]=="@":

                        nums[im][j]="!"

        for i in range(0,n+1):

            for j in range(0,n+1):

                if nums[i][j]=="!":

                    nums[i][j]="@"

        aa(nums,m-1)

                   

aa(nums,m)

g =0

for ig in range(0,n+1):

        for jg in range(0,n+1):

            if nums[ig][jg]=="@":

                 g+=1

               

print(g,nums)



 

                                                                            

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值