#include<iostream>
using?namespace?std;
#include<time.h>
#define?M?70
#define?N?20
void?mShow(int?a[N+2][M+2])
{?int?i,j;
for?(?i=0;i<N;i++,cout<<endl?)
for?(?j=0;j<M;j++?)
if?(?a[i+1][j+1]?)?cout<<'*';
else?cout<<'.';
//cout<<(?a[i+1][j+1]?)?('*'):('?');
}
int?mJduge(int?a[N+2][M+2])
{?int?i,j,k,s,*p[9],b[N][M];
for?(?i=0;i<N;i++?)
{
p[0]=p[4]=p[5]=&a[i+1][1];?p[4]--;?p[5]++;//?1?2?3
p[1]=p[2]=p[3]=p[0]-M-2;?p[1]--;?p[3]++;?//?4?0?5
p[6]=p[7]=p[8]=p[0]+M+2;?p[6]--;?p[8]++;//?6?7?8
for?(?j=0;j<M;j++?)
{?for?(?k=1,s=0;k<9;k++?)?s+=(*p[k]);
b[i][j]=*p[0];
if?(?s>=3?)?b[i][j]=1;
else?if?(?s<2?)?b[i][j]=0;
for?(?k=0;k<9;k++?)?p[k]++;
}
}
for?(?i=0,s=1;i<N;i++?)?for?(?j=0;j<M;j++?)?{?a[i+1][j+1]=b[i][j];?if?(?b[i][j]==0?)?s=0;?}
return?s;
}
void?main()
{
int?a[N+2][M+2],b[N][M],*p[9];
int?t,i,j,k;
for?(?i=0;i<N+2;i++?)?for?(?j=0;j<M+2;j++?)?a[i][j]=0;
srand((unsigned?int)time(NULL));
for?(?i=0;i<N;i++?)?for?(?j=0;j<M;j++?)?{?k=rand()%100;?a[i+1][j+1]=(?k>=77?)?(1):(0);?}
cout<<"--------?T=0--------"<<endl;?mShow(a);
k=0;?t=0;
while?(?!k?)
{?k=mJduge(a);?t++;
cout<<"--------?T="<<t<<"?--------"<<endl;?mShow(a);
}
}
a數組比實際要的數組大壹圈,大出來的壹圈永恒等於0,作為邊界,省得計算8連通數據時數組越界
b數組用於計算本次的結果,計算完成後復制、覆蓋a數組中間部分作為結果
主程序做直到所有空間都被活細胞占滿情況停止
以下是設置M=10,N=5的測試部分結果