给定一个 n x n 的网格,其中每个单元的初始状态为 ALIVE 或 DEAD,模拟 k 个时刻后的网格状态,并输出。
输入
3 3
0 0 0
1 1 1
0 0 0
0 0 0
1 1 1
0 0 0
由于输入为数组所以我们将数字储存在数组中
遵循以下四条规则:
- 人口过少:如果一个活细胞周围活细胞的个数小于 2,那么它在下一个时刻会死亡。
- 正常:如果一个活细胞周围有 2 或 3 个活细胞,那么它在下一个时刻仍然存活。
- 人口过多:如果一个活细胞周围有超过 3 个活细胞,那么它在下一个时刻会死亡。
- 繁殖:如果一个死细胞周围正好有 3 个活细胞,那么它在下一个时刻会复活
因为活细胞为1,则可以通过获取周围几个数的和来判断规则
在下两个代码中都用建立函数来判断每个细胞一个时刻后的状况
再通过k个时刻的循环来得出最后的数组
c代码如下
#include <stdio.h> int n, k; int list[1000][1000] ; int list2[1000][1000]; int rule(int list[1000][1000], int x, int y) { /*自建判断函数,并返回一个时刻后的细胞状况*/ int now = list[x][y]; int x_list[] = {x - 1, x, x + 1}; int y_list[] = {y - 1, y, y + 1}; int surrand = 0; int a, b; for (int i = 0; i <= 2; i++) { a = x_list[i]; if (a < 0 || a > n - 1) { continue; } for (int i = 0; i <= 2; i++) { b = y_list[i]; if ((a == x && b == y) || b<0&nbs***bsp;b>n - 1) { continue; } surrand = surrand + list[a][b]; } } if (surrand < 2 && now == 1) { return 0 ; } else if ((surrand == 2 || surrand == 3) && now == 1) { return 1 ; } else if (surrand > 3 && now == 1) { return 0 ; } else if (surrand == 3 && now == 0) { return 1 ; } return now; } int main() { /*主函数*/ int rule(int list[1000][1000], int x, int y); scanf("%d", &n); scanf("%d", &k); for (int i = 0; i < n; i++) { /*获取数组*/ for (int t = 0; t < n; t++) { scanf("%d", &list[i][t]); } } for (int i = 0; i < k; i++) { /*对每个细胞用函数进行规则判断*/ for (int i = 0; i < n; i++) { for (int t = 0; t < n; t++) { list2[i][t] = rule(list, i, t); } } for (int i = 0; i < n; i++) { for (int t = 0; t < n; t++) { list[i][t] = list2[i][t]; } } } for (int i = 0; i < n; i++) { /*输出*/ for (int t = 0; t < n; t++) { printf("%d ", list[i][t]); } printf("\n"); } }
python3代码如下 但是python3效率低,当数据量较大时,会出现超时现象( 仅供参考)
from copy import deepcopy as dc [n,k]=[int(i) for i in input().split()] alll=[] def rule(alll,x,y): now=int(alll[x][y]) x_list=[x-1,x,x+1] y_list=[y-1,y,y+1] surrand=0 for a in x_list: if a<0&nbs***bsp;a>n-1 : continue for b in y_list: if (a==x and b==y)or b<0&nbs***bsp;b>n-1: continue surrand+=int(alll[a][b]) if surrand<2 and now==1: return 0 elif (surrand==2&nbs***bsp;surrand==3) and now==1: return 1 elif surrand>3 and now==1: return 0 elif surrand==3 and now==0: return 1 return now for i in range(n): alll.append(input().split()) list_0=[[0*i for i in range(n)] for i in range(n)] for i in range(k): alll_=dc(list_0) for a in range(n): for b in range(n): alll_[a][b]=int(rule(alll,a,b)) alll=dc(alll_) for i in alll: print(*i,sep=' ')