給定奇數n,形成n階矩陣,使得橫豎斜加起來都相等。比如n=3:
08 01 06
03 05 07
04 09 02
每一行,每一列,交叉斜加起來都等於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
for 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.
奇數階魔方
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 乙個 n 階方陣的元素是1,2,n 2,它的每行,每列和2條對角線上元素的和相等,這樣 的方陣叫魔方。n為奇數時我們有1種構造方法,叫做 右上方 例如下面給出n 3,5,7時 的魔方.38 1 6 3 5 7 4 9 2 517...
奇數階魔方
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 乙個 n 階方陣的元素是1,2,n 2,它的每行,每列和2條對角線上元素的和相等,這樣 的方陣叫魔方。n為奇數時我們有1種構造方法,叫做 右上方 例如下面給出n 3,5,7時 的魔方.38 1 6 3 5 7 4 9 2 517...
奇數階幻方
編制奇數階幻方的方法 問題如 http community.csdn.net expert topic 5698 5698866.xml?temp 1421167 簡單描述 給 1 9,9個數,擺放成 3 3 的矩陣,要求每橫排,每豎排,對角線 上 3個數字相加均為15。其中矩陣也可為5 5,7 7...