我写了一种常见的实现算法,和另一种新算法,即不是每次循环计算每个细胞的周围细胞数来产生下一时刻,而是每次每个产生状态变化的细胞主动通知周围的邻居,因此每个细胞增加一个用来记录邻居数的字段。由邻居数决定每个细胞的出生和死亡,然后影响周围邻居的邻居数。并且为了不影响后续细胞的判断,需要新旧邻居数两个状态,用旧邻居数决定自己生死,而自己的生死变化影响周围邻居的新邻居数。另外如果某个格子的新旧邻居数不变则状态不变,增加一个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 }
old.c

相关文章: