美文网首页
第二讲 数组和动态数组(4)——练习3:生成奇数阶幻方

第二讲 数组和动态数组(4)——练习3:生成奇数阶幻方

作者: 天涯海角之路 | 来源:发表于2020-05-28 12:18 被阅读0次

    练习3:九宫图

    题目要求

    按照罗伯法生成奇数阶幻方

    分析

    把“1”放在中间一列最上边的方格中,从它开始,按对角线方向(比如说按从左下到右上的方向)顺次把由小到大的各数放入各方格中,如果碰到顶,则折向底,如果到达右侧,则转向左侧,如果进行中轮到的方格中已有数或到达右上角,则退至前一格的下方。


    5阶幻方罗伯法示意图.jpg

    官方代码中用的是它的对称形式

    代码1:官方的

    def magic_square(n):
        magic = [[0] * (n) for i in range(n)]
        row = n - 1
        col = n//2
        magic[row][col] = 1
        
        for i in range(2, n * n + 1):
            try_row = (row + 1) % n
            try_col = (col + 1) % n
    
            if (magic[try_row][try_col] == 0):
                row = try_row
                col = try_col
            else:
                row = (row - 1 + n) % n
            
            magic[row][col] = i
        
        for x in magic:
            print(x, sep=" ")
    
    magic_square(5)
    
    [11, 18, 25, 2, 9]
    [10, 12, 19, 21, 3]
    [4, 6, 13, 20, 22]
    [23, 5, 7, 14, 16]
    [17, 24, 1, 8, 15]
    

    代码2:我的

    def magic_square(n):
        p = [0, n//2]
        square = [[None] * n for i in range(n)]
        for i in range(1, n * n + 1):
            square[p[0]][p[1]] = i
            p0_ = (p[0] - 1) % n
            p1_ = (p[1] + 1) % n
            if square[p0_][p1_] is not None:
                p[0] += 1
            else:
                p = [p0_, p1_]
        return square
    
    
    x = magic_square(5)
    for i in x:
        print(i)
    
    [17, 24, 1, 8, 15]
    [23, 5, 7, 14, 16]
    [4, 6, 13, 20, 22]
    [10, 12, 19, 21, 3]
    [11, 18, 25, 2, 9]
    

    Tips

    1. python中单斜杠(/)返回float,就算参与运算的是整型也会返回float型
    2. Python中两个斜杠即双斜杠(//)表示地板除,即先做除法(/),然后向下取整(floor)。至少有一方是float型时,结果为float型;两个数都是int型时,结果为int型

    思考

    先建立一个空的数据坑(带有结构),把数据流依据位置信息流放入该数据坑。在这个例子中,数据流与当前数据坑的状态无关,但位置信息流与当前数据坑的状态有关。所以:

    1. 最外层循环是数据流
    2. 数据坑存储在循坏外,以方便循环内部的位置信息流去读取它
    3. 位置流的最初状态在循环外定义

    相关文章

      网友评论

          本文标题:第二讲 数组和动态数组(4)——练习3:生成奇数阶幻方

          本文链接:https://www.haomeiwen.com/subject/avyoahtx.html