矩阵每行加起来都一样怎么算?
奇数阶矩阵,横竖斜加起来都相等算法(罗伯法幻⽅)
奇数阶矩阵,横竖斜加起来都相等:
给定奇数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.