如何使用C語言實(shí)現(xiàn)細(xì)菌的繁殖與擴(kuò)散
一.引言
這是我在csdn寫的第一篇文章~作為一個初學(xué)C的萌新,昨天碰到一道關(guān)于細(xì)菌繁殖與擴(kuò)散的題目,覺得很有意思,想了一個晚上,終于想到了解法😄
二.題目
詳情細(xì)菌的繁殖與擴(kuò)散
總時間限制: 1000ms 內(nèi)存限制: 65536kB
描述:
在邊長為9的正方形培養(yǎng)皿中,正中心位置有m個細(xì)菌。假設(shè)細(xì)菌的壽命僅一天,但每天可繁殖10個后代,而且這10個后代,有兩個分布在原來的單元格中,其余的均勻分布在其四周相鄰的八個單元格中。求經(jīng)過n(1≤n≤4)天后,細(xì)菌在培養(yǎng)皿中的分布情況。
輸入:
輸入為兩個整數(shù),第一個整數(shù)m表示中心位置細(xì)菌的個數(shù)(2 ≤ m ≤ 30),第二個整數(shù)n表示經(jīng)過的天數(shù)(1 ≤ n ≤ 4)。
輸出:
輸出九行九列整數(shù)矩陣,每行的整數(shù)之間用空格分隔。整個矩陣代表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
三.思路以及代碼
思路
我的想法是這道題需要定義兩個二維數(shù)組,一個用來儲存上一天的數(shù)據(jù)(舊),一個用來計算并保存這一天的數(shù)據(jù)(新)。而這一天的數(shù)據(jù)又可以保存到舊數(shù)據(jù)中,用于下一天的計算(遞推)。
首先,在原位置上的每一個細(xì)菌都可以生兩個崽兒在原先的位置,并且在周圍的八個格子中各留下一個新生兒😝然后不幸凋亡……
這樣,我們先把上一天的數(shù)據(jù)保存在舊數(shù)據(jù)矩陣中,然后把上一天每個數(shù)據(jù)都乘以二放到新數(shù)據(jù)的矩陣中(0*2=0所以不用管),這是第一次循環(huán)。然后再進(jìn)行一次循環(huán),判斷如果舊數(shù)據(jù)矩陣的某一個位置的數(shù)據(jù)不為零,就在新數(shù)據(jù)矩陣對應(yīng)位置的周圍八個格子都加上該數(shù)據(jù),這一步就相當(dāng)于細(xì)菌在周圍單元格中的擴(kuò)散。這樣我們就完成了遞推過程。
注意哦,這個遞歸只能進(jìn)行四天(循環(huán)四次),要不然可能出現(xiàn)堆棧錯誤……
代碼
#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)長出 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)于一個儲存容器,儲存上一天的培養(yǎng)基情況 birth[i][j] = 2 * birth[i][j];//每個位置上的每個舊細(xì)菌生兩個崽,然后凋亡 } for (i = 0;i < 9;i++) for (j = 0;j < 9;j++) { if (old[i][j] != 0)//如果舊培養(yǎng)基上某個位置有細(xì)菌,就在新培養(yǎng)基上它的周圍生出一圈崽兒(記得每個細(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; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++ accumulate函數(shù)詳細(xì)介紹和具體案例
這篇文章主要介紹了C++ accumulate函數(shù)詳細(xì)介紹和具體案例,accumulate是numeric庫中的一個函數(shù),主要用來對指定范圍內(nèi)元素求和,但也自行指定一些其他操作,如范圍內(nèi)所有元素相乘、相除等2022-08-08Linux?C/C++?timeout命令實(shí)現(xiàn)運(yùn)行具有時間限制功能
inux?timeout命令的一個屬性是時間限制。可以為任何命令設(shè)置時間限制。如果時間到期,命令將停止執(zhí)行,這篇文章主要介紹了Linux?C/C++?timeout命令實(shí)現(xiàn)(運(yùn)行具有時間限制),需要的朋友可以參考下2023-02-02C語言 結(jié)構(gòu)體數(shù)組詳解及示例代碼
本文主要介紹C語言 結(jié)構(gòu)體數(shù)組,這里整理了相關(guān)資料及簡單示例代碼,以便大家學(xué)習(xí)參考,有興趣的小伙伴可以看下2016-08-08