练习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
- python中单斜杠(/)返回float,就算参与运算的是整型也会返回float型
- Python中两个斜杠即双斜杠(//)表示地板除,即先做除法(/),然后向下取整(floor)。至少有一方是float型时,结果为float型;两个数都是int型时,结果为int型
思考
先建立一个空的数据坑(带有结构),把数据流依据位置信息流放入该数据坑。在这个例子中,数据流与当前数据坑的状态无关,但位置信息流与当前数据坑的状态有关。所以:
- 最外层循环是数据流
- 数据坑存储在循坏外,以方便循环内部的位置信息流去读取它
- 位置流的最初状态在循环外定义
网友评论