我写了一种常见的实现算法,和另一种新算法,即不是每次循环计算每个细胞的周围细胞数来产生下一时刻,而是每次每个产生状态变化的细胞主动通知周围的邻居,因此每个细胞增加一个用来记录邻居数的字段。由邻居数决定每个细胞的出生和死亡,然后影响周围邻居的邻居数。并且为了不影响后续细胞的判断,需要新旧邻居数两个状态,用旧邻居数决定自己生死,而自己的生死变化影响周围邻居的新邻居数。另外如果某个格子的新旧邻居数不变则状态不变,增加一个changed字段来表示。
下面分别是旧、新两种算法。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define ROW 20 5 #define COL 60 6 #define FILEPATH "1.txt" 7 8 9 int countNbor(char data[][COL],int i,int j); 10 void world(void); 11 12 13 int main(void) 14 { 15 world(); 16 return 0; 17 } 18 19 void world(void) 20 { 21 int i,j; 22 char data[ROW][COL]; 23 char temp[ROW][COL]; 24 int time=0; 25 26 27 FILE *fp=fopen(FILEPATH,"r"); 28 29 for(i=0;i<ROW;i++) 30 { 31 for(j=0;j<COL;j++) 32 { 33 if(fgetc(fp)=='*') //表示细胞的字符 34 temp[i][j]=data[i][j]='*'; 35 else temp[i][j]=data[i][j]=' '; 36 } 37 fgetc(fp); 38 } 39 fclose(fp); 40 41 while(1) 42 { 43 time++; 44 45 system("CLS"); 46 for(i=0;i<ROW;i++) 47 { 48 for(j=0;j<COL;j++) 49 printf("%c",data[i][j]); 50 printf("\n"); 51 } 52 printf("次数:%d\n",time); 53 54 system("PAUSE>NUL"); 55 56 for(i=0;i<ROW;i++) 57 for(j=0;j<COL;j++) 58 switch(countNbor(temp,i,j)) 59 { 60 case 3: 61 data[i][j]='*'; 62 break; 63 case 2: 64 break; 65 default: 66 data[i][j]=' '; 67 break; 68 } 69 70 for(i=0;i<ROW;i++) 71 for(j=0;j<COL;j++) 72 temp[i][j]=data[i][j]; 73 } 74 75 } 76 77 int countNbor(char data[][COL],int i,int j) 78 { 79 int m,n; 80 int count=0; 81 82 for(m=i-1;m<=i+1;m++) 83 for(n=j-1;n<=j+1;n++) 84 if( (m==i&&n==j) ||m<0||n<0||m==ROW||n==COL) 85 continue; 86 else if(data[m][n]=='*') count++; 87 88 return count; 89 }