NKOI 1023 生命游戏

生命游戏

Time Limit:1000MS  Memory Limit:65536K
Total Submit:164 Accepted:65

Description

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


Input

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

Output

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

Sample Input

5 5 1
00000
01100
01010
00100
00000

Sample Output

00000
01100
01010
00100
00000

Hint

1 <= N, M <= 100
1 <= T <= 64

Source

VIJOS P1415

模拟吧……应该是这个意思,比较水就直接放代码

#include<iostream>
#include<cstdio>
using namespace std;
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
char a[100][100],b[100][100];//a是原图,b是输出的图
int m,n,t,i,j,k,p,cnt,tx,ty;
int main(){
    scanf("%d%d%d",&m,&n,&t);
    for(i=0;i<n;i++)scanf("%s",&a[i]);
    for(k=2;k<=t;k++){
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)b[i][j]=a[i][j];
        for(i=0;i<n;i++)
            for(j=0;j<m;j++){
                cnt=0;     
                for(p=0;p<8;p++){
                    tx=i+dx[p];
                    ty=j+dy[p];
                    if((tx>=0)&&(tx<n)&&(ty>=0)&&(ty<m)&&(b[tx][ty]=='1'))cnt++;
                }
                if((a[i][j]=='1')&&((cnt<2)||(cnt>3)))a[i][j]='0';
                if((a[i][j]=='0')&&(cnt==3))a[i][j]='1';
          }
    }
    for(i=0;i<n;i++){
          for(j=0;j<m;j++)printf("%c",a[i][j]);
          printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值