生命游戏(试玩版)

生命游戏(试玩版) ,第1张

7-3 生命游戏(试玩版) (15 分)
英国数学家约翰·康威在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个活细胞,下代创生。

思路:使用简单的字符数组,然后通过计算每个细胞周围活细胞数,判断下一代状态,赋值给下一个数组,来回交替,获得演化最后一代,后输出;

#include 
using namespace std;
char num[300][300];
char mum[300][300];
int n, m, k, sum;
void ji(int x, int y)
{
    sum = 0;
    char ch = '#';
    if (x - 1 >= 0)
    {
        if (num[x - 1][y] == ch)
        {
            sum++;
        }
    }
    if (x + 1 < n)
    {
        if (num[x + 1][y] == ch)
        {
            sum++;
        }
    }
    if (y - 1 >= 0)
    {
        if (num[x][y - 1] == ch)
        {
            sum++;
        }
    }
    if (y + 1 < m)
    {
        if (num[x][y + 1] == ch)
        {
            sum++;
        }
    }
    if (x + 1 < n && y - 1 >= 0)
    {
        if (num[x + 1][y - 1] == ch)
        {
            sum++;
        }
    }
    if (x + 1 < n && y + 1 < m)
    {
        if (num[x + 1][y + 1] == ch)
        {
            sum++;
        }
    }
    if (x - 1 >= 0 && y - 1 >= 0)
    {
        if (num[x - 1][y - 1] == ch)
        {
            sum++;
        }
    }
    if (x - 1 >= 0 && y + 1 < m)
    {
        if (num[x - 1][y + 1] == ch)
        {
            sum++;
        }
    }
}
int main()
{
    while (cin >> n >> m >> k)
    {
        int a = 0;
        fill(num[0], num[0] + 300 * 300, '0');
        fill(mum[0], mum[0] + 300 * 300, '0');
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                cin >> num[i][j];
                mum[i][j] = num[i][j];
            }
        }
        a = k;
        while (k--)
        {
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    ji(i, j);
                    if (num[i][j] == '.')
                    {
                        if (sum == 3)
                        {
                            mum[i][j] = '#';
                        }
                    }
                    else
                    {
                        if (sum < 2 || sum > 3)
                        {
                            mum[i][j] = '.';
                        }
                    }
                }
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    num[i][j] = mum[i][j];
                }
            }
        }
        cout << n << " " << m << " " << a << endl;

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                cout << mum[i][j];
            }
            cout << endl;
        }
    }
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/797453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存