直接模拟细胞繁殖与死亡的过程 打表记录下每次变化后的活细胞数量 发现有长度为60的循环节 即每60个数加10
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
char ch[2*maxn][maxn][maxn];
int q=200,n=100,m=100;
void init()
{
char pre[]="..........";
int i,cnt;
for(i=0;i<45;i++){
strcpy(ch[0][i],pre);
cnt=9;
while(cnt--){
strcat(ch[0][i],pre);
}
}
for(i=45;i<55;i++){
strcpy(ch[0][i],pre);
cnt=2;
while(cnt--){
strcat(ch[0][i],pre);
}
}
strcat(ch[0][45],"........................................");
strcat(ch[0][46],"..........................X.............");
strcat(ch[0][47],"........................X.X.............");
strcat(ch[0][48],"..............XX......XX............XX..");
strcat(ch[0][49],".............X...X....XX............XX..");
strcat(ch[0][50],"..XX........X.....X...XX................");
strcat(ch[0][51],"..XX........X...X.XX....X.X.............");
strcat(ch[0][52],"............X.....X.......X.............");
strcat(ch[0][53],".............X...X......................");
strcat(ch[0][54],"..............XX........................");
for(i=45;i<55;i++){
cnt=3;
while(cnt--){
strcat(ch[0][i],pre);
}
}
for(i=55;i<100;i++){
strcpy(ch[0][i],pre);
cnt=9;
while(cnt--){
strcat(ch[0][i],pre);
}
}
}
void solve()
{
int next[8][2]={0,-1,-1,0,0,1,1,0,-1,-1,-1,1,1,1,1,-1};
int i,j,k,l,tx,ty,cnt;
for(i=1;i<=q;i++){
for(j=0;j<n;j++){
for(k=0;k<m;k++){
cnt=0;
for(l=0;l<8;l++){
tx=j+next[l][0],ty=k+next[l][1];
if(0<=tx&&tx<n&&0<=ty&&ty<m&&ch[i-1][tx][ty]=='X') cnt++;
}
if(ch[i-1][j][k]=='X'){
if(cnt==2||cnt==3) ch[i][j][k]='X';
else ch[i][j][k]='.';
}
else{
if(cnt==3) ch[i][j][k]='X';
else ch[i][j][k]='.';
}
}
}
}
}
void show()
{
int i,j,k,cnt;
for(i=1;i<=q;i++){
cnt=0;
for(j=0;j<n;j++){
for(k=0;k<m;k++){
printf("%c",ch[i][j][k]);
if(ch[i][j][k]=='X') cnt++;
}
printf("\n");
}
printf("********************%d********************\n",cnt);
}
}
bool judge(int a,int b)
{
int res,i,j;
res=1;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(ch[a][i][j]!=ch[b][i][j]){
res=0;
break;
}
}
if(!res) break;
}
return res;
}
void getloop()
{
int i,j;
for(i=1;i<=q;i++){
for(j=i+1;j<=q;j++){
if(judge(i,j)){
printf("%d %d\n",i,j);
}
}
}
}
void getnum()
{
int val[2*maxn];
int i,j,k;
for(i=1;i<=q;i++){
val[i]=0;
for(j=0;j<n;j++){
for(k=0;k<m;k++){
if(ch[i][j][k]=='X') val[i]++;
}
}
}
for(i=1;i<=q;i++){
printf("%d",val[i]);
if(i%60==0) printf("\n");
else printf(" ");
}
printf("\n");
printf("***%d***\n",val[40]);
}
int main()
{
init();
solve();
//show();
//getloop();
getnum();
return 0;
}
/*
........................................
..........................X.............
........................X.X.............
..............XX......XX............XX..
.............X...X....XX............XX..
..XX........X.....X...XX................
..XX........X...X.XX....X.X.............
............X.....X.......X.............
.............X...X......................
..............XX........................
*/