問題の説明
一連の連続する正の整数1~をn行n列(nは奇数)の2次元デジタル行列に並べ、各行、各列とその対角の数値の和が求められます。行列は等しい。Python コードを使用して上記の要件を実装し、行列を出力します。
この問題の本質は、合計 1~ の正の整数を特定の規則に従って n 行 n 列の行列に配置することです。規則は、行列の各行の数値の合計は、各列の数値の合計も、対角線上の数値の合計も です。なお、n は奇数であり、n が 1 の場合は研究価値がありませんので、n が 3 から始めて配置規則がわかるかどうかを確認してください。
上記の魔方陣行列から、n 次の魔方陣行列における数値の配置規則を見つけることができます。数値 1 は、1 から始まり右上に向かって 1 ずつ増加する、最初の行の中央の列に位置する必要があります。上限を超えた場合、超えた数値は同じ列の最後の行に配置され、右境界を超えた場合、超えた数値は同じ行の最初の列に配置されます。 number にはすでに数値が存在しており、下方向にインクリメントされます。下方向にインクリメントする必要がある合計数は n の整数倍です。この規則に従って数値を並べると、n 次の魔方陣行列が得られます。
ルービック キューブ マトリックスの生成
魔方陣行列の配置規則に従って、魔方陣行列データを生成する関数を書くことができます。コードは次のとおりです。
def magic_square_array(n: int):
"""
生成魔方矩阵
:param n: 矩阵的行列数
:return:
"""
if n % 2 != 1: # 如果n不为奇数时
raise ValueError('n must is odd number') # 抛出n的值错误
array = [[0] * n for i in range(n)] # 创建一个二维列表来存放每行每列的数值
row = 0 # 初始行的值为0
column = n // 2 # 初始列的值为n/2,需要注意列表的索引从0开始
for i in range(1, n ** 2 + 1): # 使用循环连续取出1~n的平方的所有正整数
row = n - 1 if row < 0 else row # 如果行的值小于0时,行的值为n-1,否则行的值不变
column = 0 if column >= n else column # 如果列的值大于等于n时,列的值为0,否则列的值不变
array[row][column] = i # 把数字i存放到二维列表中
if i % n != 0: # 当i不能整除n时
row -= 1 # 行的值减一
column += 1 # 列的值加一
else: # 否则
row += 1 # 行的值加一
return array # 返回二维列表
ルービック キューブ マトリックスを印刷する
次に、魔方陣行列のデータを出力する関数を設計します。コードは次のとおりです。
def print_array(n: int):
"""
打印魔方矩阵
:param n: 矩阵的行列数
:return:
"""
array = magic_square_array(n) # 使用magic_square_array生成魔方矩阵二维列表
for i in range(n): # 使用循环连续获取行数
for j in range(n): # 使用循环连续获取列数
print(str(array[i][j]).center(len(str(n**2))), end=' ') # 打印出i行j列的数字
print() # 换行
完全なコード
完全なコードは次のとおりです。
def magic_square_array(n: int):
"""
生成魔方矩阵
:param n: 矩阵的行列数
:return:
"""
if n % 2 != 1: # 如果n不为奇数时
raise ValueError('n must is odd number') # 抛出n的值错误
array = [[0] * n for i in range(n)] # 创建一个二维列表来存放每行每列的数值
row = 0 # 初始行的值为0
column = n // 2 # 初始列的值为n/2,需要注意列表的索引从0开始
for i in range(1, n ** 2 + 1): # 使用循环连续取出1~n的平方的所有正整数
row = n - 1 if row < 0 else row # 如果行的值小于0时,行的值为n-1,否则行的值不变
column = 0 if column >= n else column # 如果列的值大于等于n时,列的值为0,否则列的值不变
array[row][column] = i # 把数字i存放到二维列表中
if i % n != 0: # 当i不能整除n时
row -= 1 # 行的值减一
column += 1 # 列的值加一
else: # 否则
row += 1 # 行的值加一
return array # 返回二维列表
def print_array(n: int):
"""
打印魔方矩阵
:param n: 矩阵的行列数
:return:
"""
array = magic_square_array(n) # 使用magic_square_array生成魔方矩阵二维列表
for i in range(n): # 使用循环连续获取行数
for j in range(n): # 使用循环连续获取列数
print(str(array[i][j]).center(len(str(n**2))), end=' ') # 打印出i行j列的数字
print() # 换行
print_array(5)
実行結果は以下の通りです。