奇數階矩陣,橫豎斜加起來都相等算法(羅伯法幻⽅)
奇數階矩陣,橫豎斜加起來都相等:
給定奇數N,形成N階矩陣,使得橫豎斜加起來都相等。⽐如N=3:
每⼀⾏,每⼀列,交叉斜加起來都等於15
算法思路分析過程:
⼀、暴⼒解法:循環+遞歸實現全排列組合。此法思路簡單,⽹上不少代碼實現的,但是缺點也是很明顯的,暴⼒愚蠢耗資源。
⼆、排列加上數學分析:
1、∵橫豎斜之和全相等,∴每⾏每列之和=全數字之和/n。如果n=3,和=(1+2+3+……+9)/3=45/3=15。
2、⼜∵橫豎斜之和全相等,推測出中⼼位置(x=n/2,y=n/2)的數字,為1-N^2的中⼼數字。⽐如N=3,座標(1,1)位置的數字最可能是5。
三、羅伯法幻⽅(正解)
幻⽅是⼀種⼴為流傳的數學遊戲,據説早在⼤禹治⽔時就發現過。幻⽅的特點是:由⾃然數構成n×n正⽅形陣列,稱為n階幻⽅,每⼀⾏、每⼀列、兩對⾓線上的數之和相等。法國⼈羅伯總結出了構造奇數階連續⾃然數幻⽅的簡單易⾏的⽅法“羅伯法”。下表就是⼀個⽤羅伯法排好的5階幻⽅。
羅伯法的具體⽅法如下:
把1(或最⼩的數)放在第⼀⾏正中
按以下規律排列剩下的n2-1個數: 1)每⼀個數放在前⼀個數的右上⼀格 2)如果這個數所要放的格已經超出了頂⾏那麼就把它放在底⾏,仍然要放在右⼀列3)如果這個數所要放的格已經超出了最右列那麼就把它放在最左列,仍然要放在上⼀⾏ 4)如果這個數所要放的格已經超出了頂⾏且超出了最右列那麼就把它放在前⼀個數的下⼀⾏同⼀列的格內 5)如果這個數所要放的格已經有數填⼊,處理⽅法同4)。
只要是有規律的東西,計算機很容易就可以做到。
下⾯我們把羅伯法翻譯成計算機算法思路: 定義⼀個n×n數組 把1放在第0⾏第n/2列設當前格為(i,j) 1) i減1,j加1 2) 如果i<0那麼i=n-1 3) 如果j>n-1那麼j=0
4) 如果2)和3)同時出現那麼就把j減回1,i加上2
5) 如果a(i,j)不為空那麼按照4)處理 6) 把k的值賦給當前格a(i,j)繼續循環
輸出幻⽅陣。
羅泊法(牢記⼝訣)是⾸上正中央,依次斜填切莫忘上出框界往下寫,右出框時左邊放重複便在下格填,出⾓重複⼀個樣。
python代碼實現如下:
n = 5
# 建⽴n階矩陣
matrix = [[0] * n]
for i in range(n - 1):
matrix += [[0] * n]
x, y = 0, n // 2
for i in range(1, n * n + 1):
matrix[x][y] = i
if i % n == 0:
x += 1
elif x == 0:
x = n - 1
y += 1
elif y == n - 1:
x -= 1
y = 0
else:
x -= 1
y += 1
or i in range(n):
for j in range(n):
print('%02d' % matrix[i][j], end=' ')
print('')
四、關於三階幻⽅⽹上收集到⼀些有意思的説法:
相傳,⼤禹治⽔時,洛⽔中出現了⼀個“神龜”背上有美妙的圖案,史稱“洛書”,⽤現在的數字翻譯出來,就是三階幻⽅。
南宋數學家楊輝概括其構造⽅法為:“九⼦斜排。上下對易,左右相更。四維挺出。”
《射鵰英雄傳》中黃蓉講得很清楚:“⼆四為肩,六⼋為⾜,左七右三,戴九履⼀,五居中央”
2 9 4
7 5 3
6 1 8
橫豎斜加起來都是15.
矩陣每行加起來都一樣怎麼算
矩陣相加的計算方法是矩陣中對應的元素相加,相加的前提是兩個矩陣要是通行矩陣。
即具有相同的行和列數,矩陣加法,數學術語,定義為在數學裏,矩陣加法一般是指兩個矩陣把其相對應元素加在一起的運算。
在數學中,矩陣(Matrix)是一個按照長方陣列排列的複數或實數集合,最早來自於方程組的係數及常數所構成的方陣。這一概念由19世紀英國數學家凱利首先提出。