python学习笔记1

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为死细胞,对于每个位置都满足如下的条件:

  1. 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡

  2. 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活

  3. 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡

  4. 如果死细胞周围正好有三个活细胞,则该位置死细胞复活

由于题目中要求我们用置换方法in-place来解题,所以我们就不能新建一个相同大小的数组,那么我们只能更新原有数组,但是题目中要求所有的位置必须被同时更新,但是在循环程序中我们还是一个位置一个位置更新的,那么当一个位置更新了,这个位置成为其他位置的neighbor时,我们怎么知道其未更新的状态呢,我们可以使用状态机转换:

状态0: 死细胞转为死细胞

状态1: 活细胞转为活细胞

状态2: 活细胞转为死细胞

状态3: 死细胞转为活细胞

最后我们对所有状态对2取余,那么状态0和2就变成死细胞,状态1和3就是活细胞,达成目的。我们先对原数组进行逐个扫描,对于每一个位置,扫描其周围八个位置,如果遇到状态1或2,就计数器累加1,扫完8个邻居,如果少于两个活细胞或者大于三个活细胞,而且当前位置是活细胞的话,标记状态2,如果正好有三个活细胞且当前是死细胞的话,标记状态3。完成一遍扫描后再对数据扫描一遍,对2取余变成我们想要的结果。参见代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值