一道有趣的python题目

一道有趣的python题目

三月 26, 2022

题目简介

​ 计算存活细胞数量,【四周或者斜向都算】。

  • 周围超过三个细胞时会拥挤死亡;
  • 原本存活的细胞如果周围只有 2或者3个的时候存活
  • 如果原本存活的细胞周围少于两个细胞是会孤独致死

​ 下面是题目原图(使用图床,崩了随缘

img

img

img

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
G=[(0,1),(1,0),(1,1),(1,4),(2,3),(2,4),(3,3)]
REM=[]
O=5
x=3
y=4
G.append((x,y))
print(G)
n=len(G)
#for k in range(n) :
#print(abs(G[0][0]))
CT = 0
for i in range(O) :
for j in range(O) : #前两层用于遍历表格
for k in range(n) : #遍历坐标列表,通过计算距离判断是否在周围
#print(i,j,k)
if (abs(i-G[k][0])*abs(i-G[k][0])+abs(j-G[k][1])*abs(j-G[k][1])==1): CT+=1 #当然也可以写作 x**2 也是平方的意思
if (abs(i-G[k][0])*abs(i-G[k][0])+abs(j-G[k][1])*abs(j-G[k][1])==2): CT+=1
if (((i,j) not in G and CT ==3)) :
G.append((i,j))
print('A', (i,j))
if (((i,j) in G and (CT<2 or CT > 3))) :
REM.append((i, j))
print('R', (i,j))
CT = 0
for rm in REM : #因为一开始读取了列表长度所以增加坐标不影响 但是删除会影响后续存活的判断因此跳出单独删除
if rm in G :
G.remove(rm)
print(G)

心得

​ 与其说是帮助朋友解决难题,不如说是一起学习python。

  • 这道题主要难点其实是英文,我和朋友一开始一知半解根据图片开始做题但是头晕脑胀,使用了某道翻译才将题目精简为上方三点
  • python是真的好用
  • 关于列表中使用坐标可以理解成 C语言中的二维数组 一个抽象的比喻【狗头
  • 这道题目偷偷在第一个函数头部加了列表(使用指针,全局变量)不然之后的继承函数挺头大
  • 头一次写这么长的程序(当然也不长 就是菜 【 将代码封装在一个个函数中对于大量的代码 编写后期调试都是很好用滴
  • 核心代码半小时搞定,整体代码连修bug带调试搞了两个小时 GG

全部代码【题目要求

人都麻了 原本这些就能解决了 要搞这么多函数

此代码仅作为保留 不再赘述 如果有疑问可以私信

当然这只是使用了最基础的手法写的代码 如果有更加精简好用的方法 还请师傅赐教

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Begin of your imports ------

# End of your imports ------

debug = False
# debug = True
# You may uncomment the above line if you want to watch the evoluation of the life,
# but you MUST comment it when you submit the assignment
LL=[]
def print_life_config(G, generation=-1, debug=True):
# print for debug, you do not need to modify this function
if not debug:
return
n = len(G) #len(G) returns the size of G.
for i in range(n):
for j in range(n):
print(G[i][j], end='')
print()
print(f"End of generation {generation}")

def create_empty_grid(n):
# Create an empty grid G of size n * n
# Begin of your implementation ------
G=[['-']*n for a in range(n)]
# End of your implementation ------
return G

def input_life_config(n):
# Input the life config
G = create_empty_grid(n)
print("Please input the locations of the alive cells")
# Begin of your implementation ------
while True:
x,y=map(int,input().split())
if x==-1 and y==-1:
break
else:
G[x][y]="x"
LL.append((x,y))
#print(G)
# End of your implementation ------
return G

def count_neighbors(x, y, G):
# Count the neighbors for cell (x, y) in G
# Begin of your implementation ------
count=0
s=len(LL)
for k in range(s):
if ((x-LL[k][0])**2+(y-LL[k][1])**2==1):
count=count+1
if ((x-LL[k][0])**2+(y-LL[k][1])**2==2):
count=count+1
# End of your implementation ------
return count

def update_life_config(G):
# Update G to its next generation nextG
# Begin of your implementation ------
ap = []
rm = []
nextG = create_empty_grid(n)
#print('GGG',G)
#print('LLL',LL)
for x in range(n):
for y in range(n):
count= count_neighbors(x, y, G)
if G[x][y]=="x" and (count < 2 or count > 3):
nextG[x][y]="-"
rm.append((x,y))
#print('R', (x,y))
elif G[x][y]=="x" : nextG[x][y]="x"
if G[x][y]=="-" and count==3:
nextG[x][y]="x"
ap.append((x, y))
#print('A', (x, y))

for ccc in ap:
if (ccc not in LL): LL.append(ccc)
for ttt in rm:
if (ttt in LL): LL.remove(ttt)
#print("更改后的LL",LL)
#print("ap ", ap)
#print("rm", rm)
# End of your implementation ------
return nextG


# Given code - You cannot modify the following code !!!
n = int(input("Input the size of the grid: "))
m = int(input("Input the number of generations: "))

G = input_life_config(n)
print_life_config(G, -1, debug=debug)
for i in range(m):
G = update_life_config(G)
print_life_config(G, i, debug=debug)
print(G)