多維陣列 15:細菌的繁殖與擴散 python
本人為 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())
相關文章
- PHP中二維陣列與多維陣列PHP陣列
- Java break、continue 詳解與陣列深入解析:單維陣列和多維陣列詳細教程Java陣列
- 多維陣列轉一維陣列(降維的多種方式)陣列
- 簡單介紹Lua一維陣列與多維陣列的使用陣列
- python多維陣列切片方法Python陣列
- 多維陣列陣列
- 一維多維陣列陣列
- C/C++ 二維陣列的理解(多維陣列)C++陣列
- 多維陣列排序陣列排序
- PHP 多維陣列排序PHP陣列排序
- php 一維陣列變多維PHP陣列
- Multik——Kotlin的多維陣列Kotlin陣列
- JAVA多維陣列的遍歷Java陣列
- JavaScript 學習筆記 - 多維陣列變為一維陣列JavaScript筆記陣列
- scala語法 -多維陣列陣列
- 多維陣列扁平化陣列
- PHP多個多維陣列操作(一)PHP陣列
- PHP多維陣列KeyValue的使用PHP陣列
- 指標陣列和陣列指標與二維陣列指標陣列
- JavaSE 陣列:一維陣列&二維陣列Java陣列
- 將一個多維陣列徹底的降維陣列
- NumPy之:ndarray多維陣列操作陣列
- 多維陣列拍平一層陣列
- c++筆記_多維陣列C++筆記陣列
- php多維陣列去除空元素PHP陣列
- Python資料分析 | Numpy與1維陣列操作Python陣列
- 物聯網學習教程— 多維陣列與指標陣列指標
- Java陣列宣告建立和使用以及多維陣列、Arrays類、稀疏陣列Java陣列
- C++ 獲取陣列大小、多維陣列操作詳解C++陣列
- 二維陣列與指標陣列指標
- Java 多維陣列遍歷詳解Java陣列
- PHP的SPL擴充套件庫(二)物件陣列與陣列迭代器PHP套件物件陣列
- jquery裡遍歷普通陣列和多維陣列的方法及例項jQuery陣列
- php多維陣列去除重複值的方法PHP陣列
- PHP指定欄位的多維陣列排序方法PHP陣列排序
- js 一維陣列轉二維陣列JS陣列
- js 二維陣列轉一維陣列JS陣列
- PHP二維陣列轉一維陣列PHP陣列