IDE pythocharm
下载python2.7
教程https://learnpythonthehardway.org/book/ex40.html
安装就能用了细胞自动机 简单
from threading import Timer
import time
height=10
width =10
#init board
board =[[0 for i in range(width)]for j in range(height)]
board[2][2]=1
board[2][3]=1
board[2][4]=1
#calculate + print
def gameOfLife( board):
dx = [-1, -1, -1, 0, 1, 1, 1, 0]
dy = [-1, 0, 1, 1, 1, 0, -1, -1]
for i in range(height):
for j in range(width):
cnt = 0
for k in range(8):
x = i + dx[k]
y = j + dy[k]
if x >= 0 and x < height and y >= 0 and y < width and (board[x][y] == 1 or board[x][y] == 2):
cnt += 1
if board[i][j] and (cnt < 2 or cnt > 3): board[i][j] = 2
elif (not board[i][j]) and cnt == 3: board[i][j] = 3 #??
for i in range(height):
for j in range(width):
board[i][j] %= 2
for i in range(height):
for j in range(width):
print '{:4}'.format(board[i][j]),
print
return
while True:
#sleep
time.sleep(1)
gameOfLife(board)
print
问题:IndentationError: unindent does not match any outer indentation level
缩进不合法
board = [[0]*width]*height
导致对某个数赋值的时候 对整个咧赋值 因为你可以理解每行都是对原arr = [0,1,2,3]的引用。 任意改变任意列上的值,那一列都会改变,因为他们都是同一个引用
新的声明方法 board =[[0 for i in range(width)]for j in range(height)]
定时器:#!/usr/bin/env python
from threading import Timer
import time
timer_interval=1
def delayrun():
print ‘running’
t=Timer(timer_interval,delayrun)
t.start()
while True:
time.sleep(0.1)
print ‘main running’
算法思路:http://www.cnblogs.com/grandyang/p/4854466.html
这道题是有名的康威生命游戏, 而我又是第一次听说这个东东,这是一种细胞自动机,每一个位置有两种状态,1为活细胞,0为死细胞,对于每个位置都满足如下的条件:
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡
如果死细胞周围正好有三个活细胞,则该位置死细胞复活
由于题目中要求我们用置换方法in-place来解题,所以我们就不能新建一个相同大小的数组,那么我们只能更新原有数组,但是题目中要求所有的位置必须被同时更新,但是在循环程序中我们还是一个位置一个位置更新的,那么当一个位置更新了,这个位置成为其他位置的neighbor时,我们怎么知道其未更新的状态呢,我们可以使用状态机转换:
状态0: 死细胞转为死细胞
状态1: 活细胞转为活细胞
状态2: 活细胞转为死细胞
状态3: 死细胞转为活细胞
最后我们对所有状态对2取余,那么状态0和2就变成死细胞,状态1和3就是活细胞,达成目的。我们先对原数组进行逐个扫描,对于每一个位置,扫描其周围八个位置,如果遇到状态1或2,就计数器累加1,扫完8个邻居,如果少于两个活细胞或者大于三个活细胞,而且当前位置是活细胞的话,标记状态2,如果正好有三个活细胞且当前是死细胞的话,标记状态3。完成一遍扫描后再对数据扫描一遍,对2取余变成我们想要的结果。参见代码如下: