英国数学家约翰·康威在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;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)