矩阵取回形数海龟旋转法

矩阵取回形数海龟旋转法

李兴球Python取回形数


一个数字矩形,从左上角开始向下逆时针不断取数,一直到取完所有数叫回形取数。网上有很多现成的方法,下面这种方法用的是“海龟”法。在程序中,创建了一个”虚拟”的海龟,让它沿着矩阵的边不断向左旋转即可。
以下是部分源代码。

"""
   gameturtle.py
   本程序纯粹定义一个抽象的海龟类
   坐标系为左上角为原点,y方向下为正,方向0为向右,90度为向下!
   这个tkinter画布坐标系及pygame坐标与计算机屏幕分辨率坐标系都是一致的!
   测试程序为回形取数算法。主要方法是先在最大矩阵左上角,逆时针旋转一周,
   再前进一个单位,这个时候到达了内层矩阵的左上角。
   由于内层矩阵比外层矩阵的行列数分别小2,所以下面的m和n都要减2!
   这个程序也是gameturtle的最原始版本。
"""
__author__ = '李兴球'
__date__ = '2020/10/31'
__blog__ = 'www.lixingqiu.com'
__version__ = 0.01

import time
import math

class GameTurtle:
    
    def __init__(self):
     
        self._heading = 0     # 初始朝向        
        self._pos = (0,0)     # 初始坐标
    pass

Sprite = GameTurtle           # 定义类的别名

if __name__ == "__main__":

    t = GameTurtle()
   
    m = 3                    # 行数
    n = 4                    # 列数
    data_list = []
    x = 1
    for r in range(m):
        nest = []
        for c in range(n):
            nest.append(x)
            x = x + 1
        data_list.append(nest)
    print(data_list)
                
    t.setheading(90)        # 注意这里是向下!
    points = [t.pos()]      # 第一个坐标点
   
    def forappend():        
        t.fd(1)
        if t.pos() not in points:
            points.append(t.pos())                        

    while True:
        # points中没有这个坐标点就加进去
        # 发现已经有点在points中,那么for循环可以提前结束,下面的并没有提前结束         
        [forappend() for r in range(m-1)]
        t.left(90)
        
        [forappend() for c in range(n-1)]        
        t.left(90)
        
        [forappend() for r in range(m-1,0,-1)]           
        t.left(90)

        if m==1:break 
        [forappend() for c in range(n-2,0,-1)]        
        t.left(90)

        # 继续向前移动一格到达内圈左上角,准备内层遍历。
        forappend()     
        # 
        m = m - 2
        n = n - 2     
        if m<1 or n <1:
            print('终止条件到达')
            break
    datas = [ data_list[y][x] for x ,y in points]
    print(datas)

需要完整代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

李兴球

李兴球的博客是Python创意编程原创博客