python学习笔记1

    xiaoxiao2021-12-02  50

    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取余变成我们想要的结果。参见代码如下:

    转载请注明原文地址: https://ju.6miu.com/read-679738.html

    最新回复(0)