每个细胞有两种状态——存活或者死亡,每个细胞只与以其自身为中心的细胞产生互动。
当细胞为死亡状态,若周围有3个存活细胞,则该细胞变成存活状态(模拟繁殖)
当细胞为存活状态,若周围有2个或3个存活细胞,保持原样
若周围有3个以上存活细胞,该细胞变成死亡(模拟极度拥挤)
若周围有低于2个一下存活细胞,该细胞死亡(模拟人口稀疏)
//二维数组也是连续存储的,将二维数组转化为一维数组经行传递,然后利用寻址的方式进行操作。
//system("pause");
//system("cls");
#include<stdio.h>
#include<stdlib.h>
int panduan(int *a,int *a2,int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
if(a[i*m+j]!=a2[i*m+j])
{
return 0;
}
}
return 1;
}
void copy_a_a2(int *a,int *a2,int n,int m)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
a2[i*m+j]=a[i*m+j];
return ;
}
int main()
{
int n,m;
int i,j,k;
int time;
int x[8]={-1,-1,-1,0,0,1,1,1};
int y[8]={-1,0,1,-1,1,-1,0,1};
int tx,ty,sum;
printf("Please input n and m:");
scanf("%d%d",&n,&m);
int a[n][m];
int a2[n][m];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
a[i][j]=1;
a2[i][j]=1;
}
time=0;
while(1)
{
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf(a[i][j]==1?"#":".");
printf("\n");
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
for(k=0,sum=0;k<8;k++)
{
tx=i+x[k];
ty=j+y[k];
if(tx<0||ty<0||tx>n||ty>m||a[tx][ty]==0)
continue;
else sum++;
}
switch(sum)
{
case 2:break;
case 3:a[i][j]=1;break;
default :a[i][j]=0;break;
}
}
}
time++;
if(panduan((int *)a,(int *)a2,n,m)==1)
break;
else copy_a_a2((int *)a,(int *)a2,n,m);
system("pause");
system("cls");
}
printf("达到稳定数目所需时间:%d",time);
return 0;
}