如何使用C语言实现细菌的繁殖与扩散

 更新时间:2021年11月02日 11:31:18   作者:Tim_zf  
这篇文章主要为大家详细介绍了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;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Qt TCP实现简单通信功能

    Qt TCP实现简单通信功能

    这篇文章主要为大家详细介绍了Qt TCP实现简单通信功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • c语言冒泡排序法代码

    c语言冒泡排序法代码

    c语言冒泡排序法代码,这个是大家最早接触的算法吧,总在写 总在错,学习就是这么个过程, 温故才知新, 望自己谨记
    2013-02-02
  • C++ accumulate函数详细介绍和具体案例

    C++ accumulate函数详细介绍和具体案例

    这篇文章主要介绍了C++ accumulate函数详细介绍和具体案例,accumulate是numeric库中的一个函数,主要用来对指定范围内元素求和,但也自行指定一些其他操作,如范围内所有元素相乘、相除等
    2022-08-08
  • Linux C/C++ timeout命令实现运行具有时间限制功能

    Linux C/C++ timeout命令实现运行具有时间限制功能

    inux timeout命令的一个属性是时间限制。可以为任何命令设置时间限制。如果时间到期,命令将停止执行,这篇文章主要介绍了Linux C/C++ timeout命令实现(运行具有时间限制),需要的朋友可以参考下
    2023-02-02
  • C语言动态规划之背包问题详解

    C语言动态规划之背包问题详解

    这篇文章主要介绍了C语言动态规划之背包问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C语言中指针的加减运算方法示例

    C语言中指针的加减运算方法示例

    这篇文章主要给大家介绍了关于C语言中指针的加减运算的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • C++深入浅出讲解希尔排序算法的实现

    C++深入浅出讲解希尔排序算法的实现

    希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现
    2022-05-05
  • C语言二叉树层序遍历

    C语言二叉树层序遍历

    这篇文章主要介绍了C语言二叉树层序遍历,文章基于C语言的相关资料展开详细的文章内容,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-04-04
  • 浅谈C++中char型变量的地址输出

    浅谈C++中char型变量的地址输出

    下面小编就为大家带来一篇浅谈C++中char 型变量的地址输出。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • C语言 结构体数组详解及示例代码

    C语言 结构体数组详解及示例代码

    本文主要介绍C语言 结构体数组,这里整理了相关资料及简单示例代码,以便大家学习参考,有兴趣的小伙伴可以看下
    2016-08-08

最新评论