生命游戏(试玩版) (15 分)

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

题目描述

英国数学家约翰·康威在1970年设计了一种称为生命游戏(Game of Life)的细胞自动机。

生命游戏的世界是个二维的细胞网格,每个细胞(格子)有存活、死亡两种状态,各有8个邻居。由当前状态演化下一代的规则是:

如果活细胞周围有2或3个活细胞,那么在下一代存活,否则死亡(邻居过少则孤独、过多则资源匮乏)。
如果死细胞周围有3个活细胞,那么在下一代将创生(繁殖)。

这两条规则虽然机械,却能演化出类似生命的现象,出现很多有趣的模式。参考这个网站:https://playgameoflife.com/

我们来模拟下生命游戏的演化。模拟时要符合细胞自动机的三个特性:

并行性:每一代中,所有细胞同时演化。
局部性:下代细胞状态由当代的局部环境决定。
一致性:所有细胞遵循相同的演化规则。

输入格式

输入有多组数据,处理到EOF为止。
每组数据包括:
    首行有3个非负整数:行数R、列数C、演化代数G。
    之后有R行字符串、每行C个字符。.代表死细胞,#代表活细胞。
网格尺寸R、C不超过256,迭代G不超过100,这次不考察时空复杂性。
网格边界以外视为死亡细胞。

输出格式

对每组数据,演化G代后输出状态。格式与输入规格相同。

输入样例

3 4 1
.#…
####
#…

输出样例

3 4 1
##…
#.#.
#.#.

样例解释

[0][0]当代是死细胞、周围有3个活细胞,下代创生。
[0][1]当代是活细胞、周围有3个活细胞,下代维持存活。
[0][2]当代是死细胞、周围有4个活细胞,下代仍死亡。
[0][3]当代是死细胞、周围有2个活细胞,下代仍死亡。
[1][1]当代是活细胞、周围有4个活细胞,下代死亡(邻居过多)。
[1][3]当代是活细胞、周围有1个活细胞,下代死亡(邻居过少)。
[2][2]当代是死细胞、周围有3个活细胞,下代创生。

个人思路

  1. 模拟题
  2. 这里用两个二维数组来进行模拟,题目中有说不考虑时空复杂性,但以防万一,这里用了一个fst来标志当前数组,两个数组交替作为当前数组来进行逐代的模拟
#include<bits/stdc++.h>
using namespace std;
#define MAX 0x3f3f3f
int a[8]={
    
    -1,-1,-1,0,1,1,1,0};
int b[8]={
    
    -1,0,1,1,1,0,-1,-1};
int main()
{
    
    
    int r,c,t;
    while(cin>>r>>c>>t)
    {
    
    
        int g=t;
        int m1[r+10][c+10];
        int m2[r+10][c+10];
        memset(m1,0,sizeof(m1));
        memset(m2,0,sizeof(m2));
        bool fst=true;
        for(int i=1;i<=r;i++)
        {
    
    
            for(int j=1;j<=c;j++)
            {
    
    
                char tempc;
                cin>>tempc;
                if(tempc=='#')
                    m1[i][j]=1;
            }
        }
        while(g--)
        {
    
    
            for(int i=1;i<=r;i++)
            {
    
    
                for(int j=1;j<=c;j++)
                {
    
    
                    int sum=0;
                    for(int k=0;k<8;k++)
                    {
    
    
                        if(fst)
                        {
    
    
                            if(m1[i+a[k]][j+b[k]])
                             sum++;
                        }
                        else
                        {
    
    
                            if(m2[i+a[k]][j+b[k]])
                             sum++;
                        }
                            
                    }
                    if(fst)
                    {
    
    
                        if(m1[i][j])
                        {
    
    
                            if(sum==2||sum==3)
                                m2[i][j]=1;
                            else
                                m2[i][j]=0;
                        }
                        else
                        {
    
    
                            if(sum==3)
                                m2[i][j]=1;
                            else
                                m2[i][j]=0;
                        }
                    }
                    else
                    {
    
    
                        if(m2[i][j])
                        {
    
    
                            if(sum==2||sum==3)
                                m1[i][j]=1;
                            else
                                m1[i][j]=0;
                        }
                        else
                        {
    
    
                            if(sum==3)
                                m1[i][j]=1;
                            else
                                m1[i][j]=0;
                        }
                    }
                    
                }
            }
            if(fst)
                fst=false;
            else
                fst=true;
        }
        cout<<r<<" "<<c<<" "<<t<<endl;
        for(int i=1;i<=r;i++)
        {
    
    
            for(int j=1;j<=c;j++)
            {
    
    
                if(fst)
                {
    
    
                    if(m1[i][j])
                        cout<<'#';
                    else
                        cout<<'.';
                }
                else
                {
    
    
                    if(m2[i][j])
                        cout<<'#';
                    else
                        cout<<'.';
                }
            }
            cout<<endl;
        }
    }
    
}

猜你喜欢

转载自blog.csdn.net/weixin_46050495/article/details/124133619