1.8.15细菌的繁殖与扩散

发布时间 2023-07-24 11:52:41作者: 邓乔泽

1.题目意思

描述

在边长为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
2.题目意思总结
从题目可知,在9*9的空间里有m个细菌,每一次繁殖,周围的八个单元格都加上中间格子现有的(上一次繁殖后)细菌个数,中间格子的细菌数量扩大到原来的2倍,以此类推。

3.解题思路
(1)建立两个数组及一些辅助变量,并输入
(2)第一个数组用于保存上一次繁殖的细菌个数,第二个数组根据第一个数组的数据计算繁殖后个数,并将数据保存在第一个数组中,以完成一次繁殖。
(3)输出数组,注意空格和换行。
4.代码实现

#include<bits/stdc++.h>
using namespace std;
int main(){
  int a[10][10],b[10][10],n;
  cin>> a[5][5]>> n;
  b[5][5]=a[5][5];
  for(int i=1;i<=9;i++){
    for(int k=1;k<=9;k++){
      if(i!=5 or k!=5){//将数组中心赋值为m,其余赋值为0
        a[i][k]=0;
        b[i][k]=0;
      }
    }
  }
  for(int j=1;j<=n;j++){
    for(int i=1;i<=9;i++){
      for(int k=1;k<=9;k++){//计算每一次繁殖数据
        if(a[i][k]>0){
          b[i][k]=b[i][k]+a[i][k];
          b[i-1][k-1]=b[i-1][k-1]+a[i][k];
          b[i-1][k]=b[i-1][k]+a[i][k];
          b[i-1][k+1]=b[i-1][k+1]+a[i][k];
          b[i][k-1]=b[i][k-1]+a[i][k];
          b[i][k+1]=b[i][k+1]+a[i][k];
          b[i+1][k-1]=b[i+1][k-1]+a[i][k];
          b[i+1][k]=b[i+1][k]+a[i][k];
          b[i+1][k+1]=b[i+1][k+1]+a[i][k];
        }
      }
    }
    for(int i=1;i<=9;i++){//将每一次繁殖数据同步至另一个数组
      for(int k=1;k<=9;k++){
        a[i][k]=b[i][k];
      }
    }
  }
  for(int i=1;i<=9;i++){
    for(int k=1;k<=9;k++){//输出
      cout<< a[i][k]<<" ";
    }
    cout<< endl;
  }
  return 0;
}