背景
生命游戏中,对于任意细胞,规则如下:
- 每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八个细胞产生互动。
- 当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
- 当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
- 当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
- 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
本实验中,需要在一个平面上使用细胞自动机模型实现生命游戏模拟。可以把最初的细胞结构定义为种子,当所有在种子中的细胞同时被以上规则处理后, 可以得到第一代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。
要求
- 设定平面大小至少为2020(WidthHeight),具体数值可以自行设定。
- 实现顺序代码后,使用MPI实现一个简单的并行情况代码。
代码
顺序代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 42
#define M 72
//平面大小40×70,周围一圈作为边界
char cell = '@'; //细胞形状
void init(char cells[N][M]);
void show(char cells[N][M]);
void evolve(char cells[N][M]);
int around(char cells[N][M], int x, int y);
int main(int argc, char *argv[])
{
if(argc != 2)
{
//用户输入代数
printf("Usage:%s number\n", argv[0]);
return 1;
}
char cells[N][M];
int i = 0, G=atoi(argv[1]);
init(cells);
show(cells);
while(i++ < G) {
sleep(1);
evolve(cells);
show(cells);
printf("\ngeneration %d\n",i);
}
return 0;
}
void init(char cells[N][M])
{
//随机初始化培养皿
int i,j;
srand(time(0));
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(rand()%2 || 0==i || 0==j
|| N-1 == i || M-1 == j)
cells[i][j]=' ';
else
cells[i][j]=cell;
}
void show(char cells[N][M])
{
int i,j;
system("clear");
for(i=0;i<N;i++) {
</