Python之任意階幻方的構造

2021-08-09 23:14:48 字數 3268 閱讀 3610

本文在用python構造任意階幻方的時候,參考的資料如下: 

- 維基百科:

- 幻方:

- **:由矩陣構造奇數階幻方的方法,高建國,河南大學學報

python**如下:(具體的構造方法可參看以上資料)

# -*- coding: utf-8 -*-

#利用numpy模組構造幻方

import numpy as np

#列表迴圈向左移offset位

defshift_left

(lst, offset):

return [lst[(i+offset)%len(lst)] for i in range(len(lst))]

#列表迴圈向右移offset位

defshift_right

(lst, offset):

return [lst[i-offset] for i in range(len(lst))]

#構造奇數階幻方函式

defmagic_of_odd_order

(n):

p = (int)((n-1)/2)

#建立矩陣1

initial_lst1 = list(range(p+1,n))+list(range(p+1))

initial_mat1 =

for i in range(n):

mat1 = np.array(initial_mat1)

#建立矩陣2

initial_lst2 = list(range(p,-1,-1))+list(range(2*p,p,-1))

initial_mat2 =

for i in range(n):

mat2 = np.array(initial_mat2)

#建立矩陣3,即元素全為1的矩陣

mat3= np.ones((n,n),dtype=np.int)

#構造幻方

magic = n*mat2+mat1+mat3

return magic

#構造4n階幻方函式

defmagic_of_4n_order

(n):

mat = np.array(range(1,n*n+1)).reshape(n,n)

for i in range((int)(n/4)):

for j in range((int)(n/4)):

for k in range(4): #將每個4*4小方塊的對角線換成互補元素

mat[k+4*j][k+4*i] = n*n+1-mat[k+4*j][k+4*i]

mat[k+4*j][3-k+4*i] = n*n+1-mat[k+4*j][3-k+4*i]

return mat

#構造4n+2階幻方函式

defmagic_of_4n2_order

(n):

p = (int)(n/2)

mata = magic_of_odd_order(p)

matd = mata+p**2

matb = matd+p**2

matc = matb+p**2

#交換矩陣塊a與矩陣塊c中特定元素的位置

row = (int)((p-1)/2)

for i in range(p):

if i != row:

for k in range((int)((n-2)/4)):

mata[i][k],matc[i][k] = matc[i][k],mata[i][k]

else:

for k in range((int)((n-2)/4)):

mata[i][row+k],matc[i][row+k] = matc[i][row+k],mata[i][row+k]

#交換矩陣塊b與矩陣塊d中特定元素的位置

col = (int)((p-1)/2)

for j in range(col+2-(int)((n-2)/4),col+1):

for i in range(p):

matb[i][j],matd[i][j] = matd[i][j],matb[i][j]

#合併矩陣塊a,b,c,d組成幻方

magic = np.row_stack((np.column_stack((mata,matb)),np.column_stack((matc,matd))))

return magic

defmain

(): order = eval(input('enter the order of magic square(>=3): '))

if order%2 ==1:

magic = magic_of_odd_order(order)

elif order%4 == 0:

magic = magic_of_4n_order(order)

else:

magic = magic_of_4n2_order(order)

print('generating magic square of %d order......'%order)

for row in magic:

for col in row:

print(col, end='\t')

print()

#驗證生成的magic是否為幻方

val = input(("do you want to validate?[y|n]"))

if val == 'y'

or val == 'y':

print('每行的和:', np.sum(magic, axis=0))

print('每列的和:', np.sum(magic, axis=1))

print('主對角線的和:', sum([magic[i][i] for i in range(order)]))

print('副對角線的和:', sum([magic[i][order-1-i] for i in range(order)]))

print('it\'s done!')

main()

執行結果如下:

奇數階幻方構造法

siamese方法 kraitchik 1942年,pp.148 149 是構造奇數階幻方的一種方法,說明如下 由於幻方的對稱性,也可以把右上改為右下 左上以及左下等方位 實現 include includeusing namespace std int main else if i 0 i n 1...

三階幻方python解法

三階幻方 1 9共9個數字填入九宮格中,九宮格中間元素為5,各行 列 對角線元素相加和為15。求解出所有符合條件的排列。python解法1 由於九宮格中間元素已確定,剩下元素中選擇乙個數填入tmp 0 0 再選擇乙個數填入tmp 0 1 則剩下元素都可根據已填元素確定,通過兩層巢狀迴圈實現。lst ...

magic squire幻方的學習 奇數階幻方

今天介紹了關於幻方的一些知識,並布置了一些相關的家庭作業。幻方,我的理解就是一種數獨吧,要求每行每列還有對角邊的和都一樣,填進空格的數字是1 n n是階數,比如三階幻方就是將1到9的數字填進3x3的九宮格裡。所有數字的和可以用求和公式 1 2 n n n 1 2 假設每行每列的和為 s,那麼 3s ...