【c++细菌的繁殖与扩散】毒瘤题目的题解与说明

好吧,可能对于各位神犇来说这题也没什么毒性。。但我在这题里面挣扎了很久啊啊啊!!!还是感谢我的同桌教会了我这道题QWQ

问题 M: 细菌的繁殖与扩散


题目描述

在边长为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

首先一定要明白不能只用一个数组做!要用两个数组分工配合!


那个“变化”数组用来干什么呢?因为题目中说其余的均匀分布在其四周相邻的八个单元格中,所以我把这八个方向的位置变化用了一个8行2列的二维数组存起来。因为数组有两列,所以用{}把数字两两括起来进行初始化。这个数组大概是这样的:


细菌在繁殖的过程中会向八个方向扩散,坐标变化像这样:

bh这个数组记录的就是这种变化。到时只要在原细菌的坐标基础上加上这种变化就是新细菌的坐标~

扫描二维码关注公众号,回复: 2722948 查看本文章

初始化:

调试如图:

中间已经放了2个细菌啦~


关于细菌分裂后的分布规律大家可以自己打几遍草稿。。。我就不细说了,这里可能交代得不太好。。。可以在评论中问我的!

最后只要输出就行啦!

#include<iostream>
#include<cstring>
using namespace std;
int ss[10][10],ss2[10][10],/*ss用来记录+判断,ss2用来搞生育_(:з」∠)_*/bh/*变化*/[8][2]={{-1,0},{1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
int main()
{
	int m,n,d;
	cin>>m>>n;
	for (int i=1;i<=9;i++)
	{
		for (int j=1;j<=9;j++)
		{
				ss[i][j]=0;
				ss2[i][j]=0;
		}
	}
	ss[5][5]=m;
	ss2[5][5]=m;
	for (int day=1;day<=n;day++)//天数 
	{
		for (int i=1;i<=9;i++)
		{
			for (int j=1;j<=9;j++)
			{
				if (ss[i][j]>0)//ss数组上的某个位置发现了细菌
				{
					for(d=0;d<=7;d++)//当某个细菌繁殖方向不超过8个时(从0到7,会有8个方向)
						 ss2[i+bh[d][0]][j+bh[d][1]]+=ss[i][j];//原坐标加新坐标得到新细菌坐标,它们的值等于“母体”的数量 
					ss2[i][j]+=ss[i][j];//10x个后代,有原数个分布在原来的单元格中
				}
			}
		}
		for(int i=1;i<=9;i++) for(int j=1;j<=9;j++) ss[i][j]=ss2[i][j];//b数组繁殖完一次后,a数组负责记录新的生育情况
	}
	for (int i=1;i<=9;i++)
	{
		for (int j=1;j<=9;j++) cout<<ss[i][j]<<' ';	
		cout<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/JaneSilver/article/details/80977645