openjudge 1.8.15 细菌的繁殖与扩散

本文介绍了一个模拟细菌繁殖的算法实现,通过二维数组记录细菌的数量变化,使用方向数组进行裂变传播,确保每次裂变后细菌数量准确更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenJudge - 15:细菌的繁殖与扩散


解题思路:

1.由题可得,在一个9*9的矩阵中正中心有细菌,细菌每天都会裂变,此位置上会裂变为细菌数量的2倍,其他相邻的八个方向会裂变为相同的细菌数量,看到方向,可以想到会用方向数组来表示

2.还有一个关键信息叫细菌每次分裂完后就会死亡,在这里会带来一个问题,就是如果两个相邻的细菌格子,左边的后代裂变给右边后,右边的数量发生改变,从而无法判断右边的母体数量到底是多少,而且我们遍历的顺序是每行挨个遍历,有很多位置都会影响此位置的数量,所以为了简单处理,设置另一个数组b,来做结果数组

3.首先,将正中心位置赋值,表示细菌的数量a[5][5]=m,接下来开始遍历二维数组a,如果这个数组的位置不是0的话,那么利用方向数组,将八个方向都赋值,并且本身也赋值,即b[i][j]+=a[i][j]*2,b[x][y]+=a[i][j]记住还需要加上原本位置的数量,因为b是结果数组,此时肯定没有母体,一个位置可能会受到多个位置的裂变影响,所以必须加上本身位置的数量

4.完成一次裂变后,将结果数组b赋值给数组a,表示第一次裂变完成,并清空数组b,为下一次的裂变做准备

5.最后,利用while循环,控制裂变的天数,输出数组a


#include<bits/stdc++.h>
using namespace std;

int a[15][15],b[15][15];//b数组用来做过渡数组 
int xx[10]={0,-1,1,0,0,-1,1,-1,1};//方向数组,分别为上下左右左上左下右上右下的行号 
int yy[10]={0,0,0,-1,1,-1,-1,1,1};//列号 

void f()//裂变函数f 
{
	for(int i=1;i<=9;i++)//遍历二维数组 
	{
		for(int j=1;j<=9;j++)
		{
			if(a[i][j]!=0)//如果该位置上有细菌 
			{
				b[i][j]+=2*a[i][j];//将参照系数组中的对应位置变为2倍并加上该位置的细菌 

				for(int k=1;k<=8;k++)
				{
					int x=xx[k]+i;
					int y=yy[k]+j;
					b[x][y]+=a[i][j];//将该位置的八个方向的位置分别赋值并加上该位置的细菌 
				}
			}
		}
	}

	for(int i=1;i<=9;i++)
	for(int j=1;j<=9;j++)
	{
		a[i][j]=b[i][j];//将裂变后的结果数组赋值给a数组 
		b[i][j]=0;//清空参照系数组,为下一次裂变做准备 
	}
	
}
int main()
{
	int m,n;
	cin>>m>>n;
	a[5][5]=m;//设置中心点的细菌数量 

	while(n)//记录共裂变几次 
	{
		f();
		n--;
	}

	for(int i=1;i<=9;i++)//输出最后的二维数组 
	{
		for(int j=1;j<=9;j++)
		cout<<a[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值