解题思路:
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
- 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<" ";
- cout<
- }
- return 0;
- }