永恒的生命游戏

题目描述

2020年4月11日,英国数学家 约翰·霍顿·康威(John Horton Conway)因为新型冠状病毒肺炎不幸逝世。他在群论、数论、代数、几何拓扑、理论物理、组合博弈论和几何等领域,都做出了重大贡献。他的离去是人类文明的损失。他最著名的发明就是生命游戏(Conway’s Game of Life)。

生命游戏定义了一种细胞自动机。该自动机由一个网格组成,每个方格代表一个细胞,细胞有两种状态:生(黑色表示)或死(白色表示)。每个细胞在下个时刻的生死取决于当前时刻相邻的八个细胞的状态,具体规则如下:

  • 如果某个原本存活的细胞,周围恰好有2个 或3个活的细胞,那么在下个时刻,它会保持存活;
  • 如果某个原本存活的细胞,周围活的细胞小于2个或多于3个,那么它在下个时刻,会因孤独或拥挤而死亡;
  • 如果某个原本死亡的细胞,周围恰好有3个活的细胞,那么在下个时刻,它会变成活的细胞。

利用这些简单的规则,生命游戏将从一个时刻迭代到下一个时刻,呈现不同的演化形态。

第一种是稳定状态,细胞自动机从诞生起,布局稳定,没有任何变化。如下图所示

1586953880(1).png

第二种是振荡状态,细胞自动机反复在几种状态间振荡变化,如下图所示

1586978363(1).png

第三种是消亡状态,细胞自动机逐渐萎缩,如下图所示

1586978524(1).png

细胞自动机还有更多有趣的状态,比如繁衍或者移动,此处就不展开了。

给定一个规模为$n×m$的细胞自动机,请判定它是否处于稳定状态。

输入描述

第一行:两个整数 $n$ 和 $m$;

接下来有 $n×m$ 个字符,表示每个细胞是否存活:

  • 若处于存活状态,用*表示,
  • 若处于死亡状态,用.表示。

数据范围

1≤n,m≤100

输出描述

若细胞自动机处于稳定状态,输出Still life,否则输出Other

输入样例
4 4
....
.**.
.**.
....
输出样例
Still life
#include <iostream>
using namespace std;
int n, m;
char map[105][105];
int main() {
	cin.tie(0);
	cin >> n >> m;

	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= m; ++j)
			cin >> map[i][j];

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			int x = 0;

			if (map[i][j] == '*') {
				if (map[i + 1][j] == '*')
					++x;

				if (map[i + 1][j - 1] == '*')
					++x;

				if (map[i + 1][j + 1] == '*')
					++x;

				if (map[i - 1][j - 1] == '*')
					++x;

				if (map[i - 1][j + 1] == '*')
					++x;

				if (map[i][j + 1] == '*')
					++x;

				if (map[i][j - 1] == '*')
					++x;

				if (map[i - 1][j] == '*')
					++x;

				if (x < 2 || x > 3) {
					cout << "Other";
					return 0;
				}
			} else {
				if (map[i + 1][j] == '*')
					++x;

				if (map[i + 1][j - 1] == '*')
					++x;

				if (map[i + 1][j + 1] == '*')
					++x;

				if (map[i - 1][j - 1] == '*')
					++x;

				if (map[i - 1][j + 1] == '*')
					++x;

				if (map[i][j + 1] == '*')
					++x;

				if (map[i][j - 1] == '*')
					++x;

				if (map[i - 1][j] == '*')
					++x;

				if (x == 3) {
					cout << "Other";
					return 0;
				}
			}
		}
	}

	cout << "Still life";
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值