题目描述
2020年4月11日,英国数学家 约翰·霍顿·康威(John Horton Conway)因为新型冠状病毒肺炎不幸逝世。他在群论、数论、代数、几何拓扑、理论物理、组合博弈论和几何等领域,都做出了重大贡献。他的离去是人类文明的损失。他最著名的发明就是生命游戏(Conway’s Game of Life)。
生命游戏定义了一种细胞自动机。该自动机由一个网格组成,每个方格代表一个细胞,细胞有两种状态:生(黑色表示)或死(白色表示)。每个细胞在下个时刻的生死取决于当前时刻相邻的八个细胞的状态,具体规则如下:
- 如果某个原本存活的细胞,周围恰好有2个 或3个活的细胞,那么在下个时刻,它会保持存活;
- 如果某个原本存活的细胞,周围活的细胞小于2个或多于3个,那么它在下个时刻,会因孤独或拥挤而死亡;
- 如果某个原本死亡的细胞,周围恰好有3个活的细胞,那么在下个时刻,它会变成活的细胞。
利用这些简单的规则,生命游戏将从一个时刻迭代到下一个时刻,呈现不同的演化形态。
第一种是稳定状态,细胞自动机从诞生起,布局稳定,没有任何变化。如下图所示
第二种是振荡状态,细胞自动机反复在几种状态间振荡变化,如下图所示
第三种是消亡状态,细胞自动机逐渐萎缩,如下图所示
细胞自动机还有更多有趣的状态,比如繁衍或者移动,此处就不展开了。
给定一个规模为$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;
}