如何使用C語言實現細菌的繁殖與擴散

一.引言

這是我在csdn寫的第一篇文章~作為一個初學C的萌新,昨天碰到一道關於細菌繁殖與擴散的題目,覺得很有意思,想瞭一個晚上,終於想到瞭解法😄

二.題目

詳情細菌的繁殖與擴散​​​​​​

總時間限制: 1000ms 內存限制: 65536kB

描述:

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

輸入:

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

輸出:

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

樣例輸入

21

樣例輸出

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*2=0所以不用管),這是第一次循環。然後再進行一次循環,判斷如果舊數據矩陣的某一個位置的數據不為零,就在新數據矩陣對應位置的周圍八個格子都加上該數據,這一步就相當於細菌在周圍單元格中的擴散。這樣我們就完成瞭遞推過程。

註意哦,這個遞歸隻能進行四天(循環四次),要不然可能出現堆棧錯誤……

代碼

#include<stdio.h>
int main()
{
	int old[9][9], birth[9][9];//舊的培養基和新的培養基,用於遞推
	int m, n;//初始中央細菌數以及遞推的天數
	int i, j, p;
	scanf("%d%d", &m, &n);
	for (i = 0;i < 9;i++)
		for (j = 0;j < 9;j++)
		{
			birth[i][j] = 0;//變量的初始化
		}
	birth[4][4] = m;//中央細菌已經長出
	for (p = 1;p <= n;p++)//開始遞推
	{
		for (i = 0;i < 9;i++)
			for (j = 0;j < 9;j++)
			{
				old[i][j] = birth[i][j];//舊培養基相當於一個儲存容器,儲存上一天的培養基情況
				birth[i][j] = 2 * birth[i][j];//每個位置上的每個舊細菌生兩個崽,然後凋亡
			}
		for (i = 0;i < 9;i++)
			for (j = 0;j < 9;j++)
			{
				if (old[i][j] != 0)//如果舊培養基上某個位置有細菌,就在新培養基上它的周圍生出一圈崽兒(記得每個細菌各生一圈兒……)
				{
					birth[i - 1][j - 1] = birth[i - 1][j - 1] + old[i][j];
					birth[i - 1][j] = birth[i - 1][j] + old[i][j];
					birth[i - 1][j + 1] = birth[i - 1][j + 1] + old[i][j];
					birth[i][j - 1] = birth[i][j - 1] + old[i][j];
					birth[i][j + 1] = birth[i][j + 1] + old[i][j];
					birth[i + 1][j - 1] = birth[i + 1][j - 1] + old[i][j];
					birth[i + 1][j] = birth[i + 1][j] + old[i][j];
					birth[i + 1][j + 1] = birth[i + 1][j + 1] + old[i][j];
				}
			}
	}
	for (i = 0;i < 9;i++)
	{
		for (j = 0;j < 9;j++)
			printf("%d ", birth[i][j]);
		printf("\n");
	}
	return 0;
}

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: