溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么使用C語(yǔ)言實(shí)現(xiàn)細(xì)菌的繁殖與擴(kuò)散

發(fā)布時(shí)間:2021-11-02 13:52:17 來(lái)源:億速云 閱讀:300 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)怎么使用C語(yǔ)言實(shí)現(xiàn)細(xì)菌的繁殖與擴(kuò)散,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

    一.引言

    這是我在csdn寫的第一篇文章~作為一個(gè)初學(xué)C的萌新,昨天碰到一道關(guān)于細(xì)菌繁殖與擴(kuò)散的題目,覺得很有意思,想了一個(gè)晚上,終于想到了解法?

    二.題目

    詳情細(xì)菌的繁殖與擴(kuò)散

    總時(shí)間限制: 1000ms 內(nèi)存限制: 65536kB

    描述:

    在邊長(zhǎng)為9的正方形培養(yǎng)皿中,正中心位置有m個(gè)細(xì)菌。假設(shè)細(xì)菌的壽命僅一天,但每天可繁殖10個(gè)后代,而且這10個(gè)后代,有兩個(gè)分布在原來(lái)的單元格中,其余的均勻分布在其四周相鄰的八個(gè)單元格中。求經(jīng)過n(1≤n≤4)天后,細(xì)菌在培養(yǎng)皿中的分布情況。

    輸入:

    輸入為兩個(gè)整數(shù),第一個(gè)整數(shù)m表示中心位置細(xì)菌的個(gè)數(shù)(2 ≤ m ≤ 30),第二個(gè)整數(shù)n表示經(jīng)過的天數(shù)(1 ≤ n ≤ 4)。

    輸出:

    輸出九行九列整數(shù)矩陣,每行的整數(shù)之間用空格分隔。整個(gè)矩陣代表n天后細(xì)菌在培養(yǎng)皿上的分布情況。

    樣例輸入

    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

    三.思路以及代碼

    思路

    我的想法是這道題需要定義兩個(gè)二維數(shù)組,一個(gè)用來(lái)儲(chǔ)存上一天的數(shù)據(jù)(舊),一個(gè)用來(lái)計(jì)算并保存這一天的數(shù)據(jù)(新)。而這一天的數(shù)據(jù)又可以保存到舊數(shù)據(jù)中,用于下一天的計(jì)算(遞推)。

    首先,在原位置上的每一個(gè)細(xì)菌都可以生兩個(gè)崽兒在原先的位置,并且在周圍的八個(gè)格子中各留下一個(gè)新生兒?然后不幸凋亡……

    這樣,我們先把上一天的數(shù)據(jù)保存在舊數(shù)據(jù)矩陣中,然后把上一天每個(gè)數(shù)據(jù)都乘以二放到新數(shù)據(jù)的矩陣中(0*2=0所以不用管),這是第一次循環(huán)。然后再進(jìn)行一次循環(huán),判斷如果舊數(shù)據(jù)矩陣的某一個(gè)位置的數(shù)據(jù)不為零,就在新數(shù)據(jù)矩陣對(duì)應(yīng)位置的周圍八個(gè)格子都加上該數(shù)據(jù),這一步就相當(dāng)于細(xì)菌在周圍單元格中的擴(kuò)散。這樣我們就完成了遞推過程。

    注意哦,這個(gè)遞歸只能進(jìn)行四天(循環(huán)四次),要不然可能出現(xiàn)堆棧錯(cuò)誤……

    代碼

    #include<stdio.h>
    int main()
    {
    	int old[9][9], birth[9][9];//舊的培養(yǎng)基和新的培養(yǎng)基,用于遞推
    	int m, n;//初始中央細(xì)菌數(shù)以及遞推的天數(shù)
    	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;//中央細(xì)菌已經(jīng)長(zhǎng)出
    	for (p = 1;p <= n;p++)//開始遞推
    	{
    		for (i = 0;i < 9;i++)
    			for (j = 0;j < 9;j++)
    			{
    				old[i][j] = birth[i][j];//舊培養(yǎng)基相當(dāng)于一個(gè)儲(chǔ)存容器,儲(chǔ)存上一天的培養(yǎng)基情況
    				birth[i][j] = 2 * birth[i][j];//每個(gè)位置上的每個(gè)舊細(xì)菌生兩個(gè)崽,然后凋亡
    			}
    		for (i = 0;i < 9;i++)
    			for (j = 0;j < 9;j++)
    			{
    				if (old[i][j] != 0)//如果舊培養(yǎng)基上某個(gè)位置有細(xì)菌,就在新培養(yǎng)基上它的周圍生出一圈崽兒(記得每個(gè)細(xì)菌各生一圈兒……)
    				{
    					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;
    }

    關(guān)于“怎么使用C語(yǔ)言實(shí)現(xiàn)細(xì)菌的繁殖與擴(kuò)散”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI