//conway_game.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "conway_game.h"
int main(void)
{
if(GripInit() != 0)
{
printf("ILlegal rows or columns!!!\n");
}
if(GripUpdate() != 0)
{
printf("ILlegal characters!!!\n");
}
GripFree();
return 0;
}
int GripInit(void)
{
int i,j;
scanf("%d %d\n", &row,&column);
if(row <= 0 || column <= 0)
{
return -1;
}
grip_char = (char**)malloc(sizeof(char *)*row);
for(i = 0;i < row;i ++)
{
grip_char[i] = (char*)malloc(sizeof(char)*column);
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
scanf("%c", &grip_char[i][j]);
}
getchar();
}
return 0;
}
void GripFree(void)
{
int i = 0;
for(i = 0;i < row;i ++)
{
free(grip_char[i]);
}
free(grip_char);
}
//将原网格映射到一个容量为[row+2][column+2]的网格中间,将死亡细胞标志为0,存活细胞标志为1
int GripConvert(int grip_int[][column + 2])
{
int i,j = 0;
for(i = 0;i < row + 2;i ++)
{
for(j = 0;j < column + 2;j ++)
{
grip_int[i][j] = 0;
}
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
if(grip_char[i][j] == '*')
grip_int[i + 1][j + 1] = 1;
else if(grip_char[i][j] == '.')
grip_int[i + 1][j + 1] = 0;
else
return -1;
}
}
return 0;
}
//计算四周存活细胞数
int CountLivingCells(int m, int n, int grip_int[][column + 2])
{
int living_count = 0;
living_count = grip_int[m][n] + grip_int[m][n + 1] + grip_int[m][n + 2] +
grip_int[m + 1][n] + grip_int[m + 1][n + 2] +
grip_int[m + 2][n] + grip_int[m + 2][n + 1] + grip_int[m + 2][n + 2];
return living_count;
}
//打印网格
void GripPrint(char grip[][column])
{
int i,j;
printf("%d %d\n", row, column);
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
printf("%c", grip[i][j]);
}
printf("\n");
}
}
int GripUpdate(void)
{
int i,j = 0;
int living_count = 0;
int temp[row + 2][column + 2];
char grip_next[row][column];
if(GripConvert(temp) != 0)
{
return -1;
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
living_count = CountLivingCells(i, j, temp);
if(living_count == 3) //周围有3个活细胞时,该细胞生
grip_next[i][j] = '*';
else if(living_count == 2) //周围有2个活细胞时,该细胞状态不变
grip_next[i][j] = grip_char[i][j];
else //周围有过多或过少活细胞时,该细胞死
grip_next[i][j] = '.';
}
}
GripPrint(grip_next);
return 0;
}
/*备份*/
/*#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "conway_game.h"
int row = 0;
int column = 0;
char **grip_char; //定义全局二维指针
int GripInit(void);
void GripFree(void);
int CountLivingCells(int m, int n);
int GripUpdate(void);
int main(void)
{
if(GripInit() != 0)
{
printf("ILlegal rows or columns!!!\n");
}
if(GripUpdate() != 0)
{
printf("ILlegal characters!!!\n");
}
GripFree();
return 0;
}
int GripInit(void)
{
int i,j;
scanf("%d %d\n", &row,&column);
if(row <= 0 || column <= 0)
{
return -1;
}
grip_char = (char**)malloc(sizeof(char *)*row);
for(i = 0;i < row;i ++)
{
grip_char[i] = (char*)malloc(sizeof(char)*column);
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
scanf("%c", &grip_char[i][j]);
}
getchar();
}
return 0;
}
void GripFree(void)
{
int i = 0;
for(i = 0;i < row;i ++)
{
free(grip_char[i]);
}
free(grip_char);
}
int CountLivingCells(int m,int n) //为了减小空间复杂度,可以把里面的temp数组赋值拿出来
{
int temp[row + 2][column + 2];
int neibour_number = 0;
int i,j = 0;
for(i = 0;i < row + 2;i ++)
{
for(j = 0;j < column + 2;j ++)
{
temp[i][j] = 0;
}
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
if(grip_char[i][j] == '*')
temp[i + 1][j + 1] = 1;
else if(grip_char[i][j] == '.')
temp[i + 1][j + 1] = 0;
else
return -1;
}
}
neibour_number = temp[m][n] + temp[m][n + 1] + temp[m][n + 2] +
temp[m + 1][n] + temp[m + 1][n + 2] +
temp[m + 2][n] + temp[m + 2][n + 1] + temp[m + 2][n + 2];
return neibour_number;
}
int GripUpdate(void)
{
int i,j = 0;
int living_count = 0;
char grip_next[row][column];
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
living_count = CountLivingCells(i, j);
if(living_count == 3) //周围有3个活细胞时,该细胞生
grip_next[i][j] = '*';
else if(living_count == 2) //周围有2个活细胞时,该细胞状态不变
grip_next[i][j] = grip_char[i][j];
else if(living_count == -1)
return -1;
else //周围有过多或过少活细胞时,该细胞死
grip_next[i][j] = '.';
}
}
printf("%d %d\n", row, column);
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
printf("%c", grip_next[i][j]);
}
printf("\n");
}
return 0;
}*/
<conway_game.h>
#ifndef CONWAY_GAME_INCLUDED
#define CONWAY_GAME_INCLUDED
int row = 0;
int column = 0;
char **grip_char; //定义全局二维指针
int GripInit(void);
void GripFree(void);
int GripConvert(int grip_int[][column + 2]);
int CountLivingCells(int m, int n, int grip_int[][column + 2]);
void GripPrint(char grip[][column]);
int GripUpdate(void);
#endif
<conway_game.c>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "conway_game.h"
int main(void)
{
if(GripInit() != 0)
{
printf("ILlegal rows or columns!!!\n");
}
if(GripUpdate() != 0)
{
printf("ILlegal characters!!!\n");
}
GripFree();
return 0;
}
int GripInit(void)
{
int i,j;
scanf("%d %d\n", &row,&column);
if(row <= 0 || column <= 0)
{
return -1;
}
grip_char = (char**)malloc(sizeof(char *)*row);
for(i = 0;i < row;i ++)
{
grip_char[i] = (char*)malloc(sizeof(char)*column);
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
scanf("%c", &grip_char[i][j]);
}
getchar();
}
return 0;
}
void GripFree(void)
{
int i = 0;
for(i = 0;i < row;i ++)
{
free(grip_char[i]);
}
free(grip_char);
}
//将原网格映射到一个容量为[row+2][column+2]的网格中间,将死亡细胞标志为0,存活细胞标志为1
int GripConvert(int grip_int[][column + 2])
{
int i,j = 0;
for(i = 0;i < row + 2;i ++)
{
for(j = 0;j < column + 2;j ++)
{
grip_int[i][j] = 0;
}
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
if(grip_char[i][j] == '*')
grip_int[i + 1][j + 1] = 1;
else if(grip_char[i][j] == '.')
grip_int[i + 1][j + 1] = 0;
else
return -1;
}
}
return 0;
}
//计算四周存活细胞数
int CountLivingCells(int m, int n, int grip_int[][column + 2])
{
int living_count = 0;
living_count = grip_int[m][n] + grip_int[m][n + 1] + grip_int[m][n + 2] +
grip_int[m + 1][n] + grip_int[m + 1][n + 2] +
grip_int[m + 2][n] + grip_int[m + 2][n + 1] + grip_int[m + 2][n + 2];
return living_count;
}
//打印网格
void GripPrint(char grip[][column])
{
int i,j;
printf("%d %d\n", row, column);
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
printf("%c", grip[i][j]);
}
printf("\n");
}
}
int GripUpdate(void)
{
int i,j = 0;
int living_count = 0;
int temp[row + 2][column + 2];
char grip_next[row][column];
if(GripConvert(temp) != 0)
{
return -1;
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
living_count = CountLivingCells(i, j, temp);
if(living_count == 3) //周围有3个活细胞时,该细胞生
grip_next[i][j] = '*';
else if(living_count == 2) //周围有2个活细胞时,该细胞状态不变
grip_next[i][j] = grip_char[i][j];
else //周围有过多或过少活细胞时,该细胞死
grip_next[i][j] = '.';
}
}
GripPrint(grip_next);
return 0;
}
/*备份*/
/*#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "conway_game.h"
int row = 0;
int column = 0;
char **grip_char; //定义全局二维指针
int GripInit(void);
void GripFree(void);
int CountLivingCells(int m, int n);
int GripUpdate(void);
int main(void)
{
if(GripInit() != 0)
{
printf("ILlegal rows or columns!!!\n");
}
if(GripUpdate() != 0)
{
printf("ILlegal characters!!!\n");
}
GripFree();
return 0;
}
int GripInit(void)
{
int i,j;
scanf("%d %d\n", &row,&column);
if(row <= 0 || column <= 0)
{
return -1;
}
grip_char = (char**)malloc(sizeof(char *)*row);
for(i = 0;i < row;i ++)
{
grip_char[i] = (char*)malloc(sizeof(char)*column);
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
scanf("%c", &grip_char[i][j]);
}
getchar();
}
return 0;
}
void GripFree(void)
{
int i = 0;
for(i = 0;i < row;i ++)
{
free(grip_char[i]);
}
free(grip_char);
}
int CountLivingCells(int m,int n) //为了减小空间复杂度,可以把里面的temp数组赋值拿出来
{
int temp[row + 2][column + 2];
int neibour_number = 0;
int i,j = 0;
for(i = 0;i < row + 2;i ++)
{
for(j = 0;j < column + 2;j ++)
{
temp[i][j] = 0;
}
}
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
if(grip_char[i][j] == '*')
temp[i + 1][j + 1] = 1;
else if(grip_char[i][j] == '.')
temp[i + 1][j + 1] = 0;
else
return -1;
}
}
neibour_number = temp[m][n] + temp[m][n + 1] + temp[m][n + 2] +
temp[m + 1][n] + temp[m + 1][n + 2] +
temp[m + 2][n] + temp[m + 2][n + 1] + temp[m + 2][n + 2];
return neibour_number;
}
int GripUpdate(void)
{
int i,j = 0;
int living_count = 0;
char grip_next[row][column];
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
living_count = CountLivingCells(i, j);
if(living_count == 3) //周围有3个活细胞时,该细胞生
grip_next[i][j] = '*';
else if(living_count == 2) //周围有2个活细胞时,该细胞状态不变
grip_next[i][j] = grip_char[i][j];
else if(living_count == -1)
return -1;
else //周围有过多或过少活细胞时,该细胞死
grip_next[i][j] = '.';
}
}
printf("%d %d\n", row, column);
for(i = 0;i < row;i ++)
{
for(j = 0;j < column;j ++)
{
printf("%c", grip_next[i][j]);
}
printf("\n");
}
return 0;
}*/
<conway_game.h>
#ifndef CONWAY_GAME_INCLUDED
#define CONWAY_GAME_INCLUDED
int row = 0;
int column = 0;
char **grip_char; //定义全局二维指针
int GripInit(void);
void GripFree(void);
int GripConvert(int grip_int[][column + 2]);
int CountLivingCells(int m, int n, int grip_int[][column + 2]);
void GripPrint(char grip[][column]);
int GripUpdate(void);
#endif