题目
生命游戏(Game of life)由英国数学家John Conway在1970年发明。事实上,它是一个“零人游戏”,也没有胜负之分,而是相当于一个确定性自动机。
游戏在N×M的细胞组成的矩阵里进行,每个细胞每个时刻的状态可能是“存活”或者“休眠”两种,细胞矩阵的状态会按以下规则进行演化:
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目不足两个,则下一秒将由于孤独而进入休眠状态。
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目超过三个,则下一秒将由于过度拥挤而进入休眠状态。
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目为两或三个,则下一秒将继续保持存活状态。
一个休眠状态的细胞,在某一秒,若周围的存活状态的细胞数目为正好三个,则认为是比较适合生存的状态,将于下一秒进入存活状态。
这里“周围”的范围包括一个细胞的上、下、左、右、左上、左下、右上、右下的细胞,如果存在的话。
现在,给定一个初始状态(即第1秒时的状态),请按照规则计算第T秒时的状态。
题解
模拟,注意状态的有效期及输入的一些坑即可。
p.s. 这是去年的WA代码改的,因此一些编码习惯与现在的不同。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include<stdio.h> char a[1005][1005],b[1005][1005]; int main() { int m,n,t,s; scanf("%d %d %d",&m,&n,&t); for(int i=1;i<=n;i++) { scanf("%s",a[i]+1); } for(int k=1;k<t;k++) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { b[i][j]=a[i][j]; s=0; if(a[i+1][j]=='1') s++; if(a[i-1][j]=='1') s++; if(a[i][j+1]=='1') s++; if(a[i][j-1]=='1') s++; if(a[i+1][j+1]=='1') s++; if(a[i+1][j-1]=='1') s++; if(a[i-1][j-1]=='1') s++; if(a[i-1][j+1]=='1') s++; if(a[i][j]=='1') if(s<2 || s>3) { b[i][j]='0'; continue; } if(a[i][j]=='0') if(s==3) { b[i][j]='1'; continue; } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=b[i][j]; } for(int i=1;i<=n;i++) printf("%s\n",a[i]+1); return 0; }
|