'''
/*N阶魔阵是一个N X N的由1到N^2之间的自然数构成的矩阵
*它的每一行、每一列和对角线之和均相等。例如,一个三阶
*魔阵,它的每一行、每一列和对角线之和均为15:
________
|8 | 1| 6|
————
|3 | 5| 7|
————
|4 | 9| 2|
————
编写一个程序打印任意N阶魔阵。
依次将1到N^2填入矩阵,填入的位置有如下规则确定。
*第一个元素放在第一行中间一列
*下一个元素存放在当前元素的上一行、下一列
*如上一行、下一列已经有内容,则下一个元素存放在当前列的下一行。
'''
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import sys
from typing import List
# 生成魔阵
def gen_magic(n: int) -> List[List[int]]:
m = [[0] * n for _ in range(n)] # 初始化一个全为0的二维数组
row, col = 0, n // 2
m[row][col] = 1
for i in range(2, n * n + 1):
r, c = (row - 1 + n) % n, (col + 1) % n
if m[r][c] == 0:
row, col = r, c
else:
row = (row + 1) % n
m[row][col] = i
return m
def main():
if sys.argv[1:] and sys.argv[1].isdigit():
n = int(sys.argv[1])
else:
n = int(input("input n(3,5,7,9...): ")) # 输入魔阵阶数
magic = gen_magic(n)
# 输出
t = len(str(n * n)) # 计算n*n的位数
for i in magic:
for j in i:
print("%-*d" % (t, j), end=" ") # 左对齐,占位是t
print("")
if __name__ == "__main__":
main()