多維陣列 15:細菌的繁殖與擴散 python

世界的隱喻發表於2020-12-10

本人為 python 小白,寫這題的程式碼有兩個原因。一是:我第一次做這道題沒有什麼思路,但百度到的都是 C++ 的解法,所以打算寫一個 python 的程式碼。二是:我打算把思路過程寫下來,這樣我以後也可以更好理解自己當時的想法。
(由於筆者接觸 python 不久,所以寫的程式碼有些冗長而且不知道如何優化,還望閱者諒解。如有錯誤,懇請指正。)

題目描述:

在邊長為9的正方形培養皿中,正中心位置有m個細菌。假設細菌的壽命僅一天,但每天可繁殖10個後代,而且這10個後代,有兩個分佈在原來的單元格中,其餘的均勻分佈在其四周相鄰的八個單元格中。求經過n(1≤n≤4)天后,細菌在培養皿中的分佈情況。

輸入格式:

輸入為兩個整數,第一個整數m表示中心位置細菌的個數(2 ≤ m ≤ 30),第二個整數n表示經過的天數(1 ≤ n ≤ 4)。

輸出格式:

輸出九行九列整數矩陣,每行的整數之間用空格分隔。整個矩陣代表n天后細菌在培養皿上的分佈情況。

輸入樣例:

2 1

輸出樣例:

0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 2 2 2 0 0 0
0 0 0 2 4 2 0 0 0
0 0 0 2 2 2 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0

簡單的思路分析

因為細菌的壽命只有一天,所以可以認為後一天的表格為全是 0 ,再加上剛繁殖的細菌。所以我的想法是用兩個列表,一個記錄前一天培養皿的狀態,一個恆為零,是用來加上剛繁殖的細菌輸出答案的。
然後分析細菌的繁殖與分佈位置。我們發現新繁殖的細菌分佈在以原先細菌為中心的 3*3 的格子中。根據題目的描述,如果設原先細菌的數量為 count ,那麼此時的表格應為:

[count count count]
[count 2*count count]
[count count count]

因為繁殖一次後有兩個分佈在原來的單元格,所以繁殖一次後原先的單元裡有的細菌數量有 2*count 個。

程式碼實現

box = [[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,]
       ]

box1 = box

num, days = map(int, input().split())

box1[4][4] = num

# step 記錄細菌所在的位置
step = [[4, 4]]

while days > 0:
    box = [[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,],
       [0, 0, 0, 0, 0, 0, 0, 0, 0,]
       ]
    
    for j, i in step:
        count = box1[j][i]
        box[j][i] += 2 * count
        # 原先細菌周圍的八個位置細菌數量都增加 count 個
        for new_x, new_y in [[j-1, i-1], [j-1, i], [j-1, i+1], [j, i-1], [j, i+1], [j+1, i-1], [j+1, i], [j+1, i+1]]:
                box[new_x][new_y] += count
                
   # 用 list1 作為過渡的列表,避免下面的迴圈無法退出
    list1 = []
    for j, i in step:
        for new_x, new_y in [[j-1, i-1], [j-1, i], [j-1, i+1], [j, i-1], [j, i+1], [j+1, i-1], [j+1, i], [j+1, i+1]]:
        # if 語句避免將重複的位置加入列表
            if [new_x, new_y] not in list1 and [new_x, new_y] not in step:
                list1.append([new_x, new_y])
    
    for i in list1:
            step.append(i)
        
    box1 = box
    
    days -= 1


for i in box:
    s = ""
    for j in i:
        s += str(j) + " "
    print(s.rstrip())

相關文章