【模拟】【RQNOJ】生命游戏

题目描述

生命游戏(Game of life)由英国数学家John Conway在1970年发明。事实上,它是一个“零人游戏”,也没有胜负之分,而是相当于一个确定性自动机。
游戏在N×M的细胞组成的矩阵里进行,每个细胞每个时刻的状态可能是“存活”或者“休眠”两种,细胞矩阵的状态会按以下规则进行演化:
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目不足两个,则下一秒将由于孤独而进入休眠状态。
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目超过三个,则下一秒将由于过度拥挤而进入休眠状态。
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目为两或三个,则下一秒将继续保持存活状态。
一个休眠状态的细胞,在某一秒,若周围的存活状态的细胞数目为正好三个,则认为是比较适合生存的状态,将于下一秒进入存活状态。
这里“周围”的范围包括一个细胞的上、下、左、右、左上、左下、右上、右下的细胞,如果存在的话。
现在,给定一个初始状态(即第1秒时的状态),请按照规则计算第T秒时的状态。

数据范围
1 <= N, M <= 100
1 <= T <= 64

输入格式

第一行,三个空格隔开的整数:M、N和T。
第二行开始的N行,每行M个字符,“0”或“1”分别代表休眠状态与存活状态的细胞。

输出格式

输出N行,每行M个“0”或“1”,表示第T秒时的状态。

样例输入

5 5 1 00000 01100 01010 00100 00000

样例输出

00000 01100 01010 00100 00000

三维状态图像


纯模拟,注意m和n。

#include char a[2][101][101]; int n,m,t,now,last; int xx[8]={0,1,1,1,0,-1,-1,-1}; int yy[8]={-1,-1,0,1,1,1,0,-1}; int check(int x,int y) { int tot=0; for (int i=0;i<8;++i) { int tex=x+xx[i],tey=y+yy[i]; if (tex>0&&tex<=n&&tey>0&&tey<=m) if (a[last][tex][tey]=='1') ++tot; } return tot; } int main() { freopen("s.txt","r",stdin); scanf("%d%d%d",&m,&n,&t); now=1; last=0; for (int i=1;i<=n;++i) { char s[1000]; scanf("%s",s); for (int j=1;j<=m;++j) a[now][i][j]=s[j-1]; } for (int tt=2;tt<=t;++tt) { if (now==1) { now=0; last=1; } else { now=1; last=0; } for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) { int tot=check(i,j); if (a[last][i][j]=='0') if (tot==3) a[now][i][j]='1'; else a[now][i][j]='0'; else if ((tot<2)||(tot>3)) a[now][i][j]='0'; else a[now][i][j]='1'; } } for (int i=1;i<=n;++i) { for (int j=1;j<=m;++j) printf("%c",a[now][i][j]); printf("/n"); } return 0; }

你可能感兴趣的:(模拟,RQNOJ)