1.引语
在九宫格里,填入1到9,使每行、每列、对角线的和相等。这似乎并不难,但是把他扩展到,在n乘n中,填入1到n*n,使每行、每列、对角线的和相等;有没有通用的解法?下面一起探讨一下。
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
2.当n=3,5,7...等奇数时,只需三个步骤即可得出结果。
1)在最外边上的中间格上填1,下面以5阶为例,如第1行的第3格。
2)按45%斜线依次填入数字
3)每当填到数字被占用时(每填n的倍数后出现,如例中5,10等后面),该数字填在前数字的邻格,如6填在5的下面一格。
奇阶过程示意图
5阶一种填法结果
3.当n等于4的倍数时,也只需3个步骤。
1)顺序填入数字
2)做标记,按1,2,3,4=不标,标,标,不标,即如 - - , - - 的方式标记,8阶例子如图。
3)有标记的转为对应的补数,即x的补数记为x̅,x x̅=对和,x̅=对和 - x或记为-x,如例中
-1=对和-1=(1 64)-1=64,对和=1 64=2 63,例中每行和=对和*8/2,对和=1 n*n
先标记一行,后标记一列
完整标记
8阶结果
4)本解法即有每个格只需一个公式得出。第i行j列的值记为aij
imark = (-1) ^ Int((i Mod 4) / 2) * ((-1) ^ Int((j Mod 4) / 2))
aij=(1 - imark) / 2 * (n * n 1) imark * ((i - 1) * n j)
4.当n=6,10等即4的倍数 2时,有两种解法
1)中间转为降2次的解法,6>4,10>8等等;外四边修正一下。
2)转为4个n/2的奇数阶解法,修正一下。
4.1)4m 2降为4m解法
以6阶为例,如图,中间记为大0,四角依次为1,2,-2,-1。第一行依次填3,4,5,6;第一列依次填7,8,9,10;当1 2 3 4 5 6=21为奇数,有限加减不能为偶数,不可能得到0,此时5和10交换,第一行可有1-3-4 10-6 2=0,第一列可有1 7 8-9-5-2=0。
10阶时第一行,顺序加入4个数,可解11-12-13 14=0,依次类推。降为4m的第一个数为2n-1。
先解4边
补全右下角补全中间
6阶最后结果
4.2)4m 2转为4个奇数阶
1)四个部分ABCD,按ACDB排列(如例),A按1开始的奇数法填写,B=A 积,C=A 2积,D=A 3积,积=max(A)=n/2 * n/2 =(2m 1)*(2m 1)
10阶ABCD分布
2)B和C从最右边开始交换m-1列
3)A和D交换,每行交换m个数字,一个方法是每行交换第1到第m个数,中间一行交换第2到m 1个数,A最中间的数要交换。
10阶化奇数解法结果
5.VBA编程代码
Sub Magicij()
’cn = ThisWorkbook.Sheets("幻方").Range("I3")
Dim arr_magic()
ReDim arr_magic(cn, cn)
If cn Mod 4 = 0 Then
For i = 1 To cn
For j = 1 To cn
'标记值1或-1,无标记为1,有标记为-1。
imark = (-1) ^ Int((i Mod 4) / 2) * ((-1) ^ Int((j Mod 4) / 2))
arr_magic(i, j) = (1 - imark) / 2 * (cn * cn 1) imark * ((i - 1) * cn j)
Next
Next
Else
If cn Mod 4 = 2 Then
'中间部分转为相邻低阶的双偶解法,即6转为4,10转为8,依次类推
cm = cn - 2
For i = 1 To cm
For j = 1 To cm
imark = (-1) ^ Int((i Mod 4) / 2) * (-1) ^ Int((j Mod 4) / 2)
arr_magic(1 i, 1 j) = (1 - imark) / 2 * (cn * cn 1) imark * ((i - 1) * cm j 2 * cm 2)
Next
Next
'固定部分 1 -3 -4 10 -6 2,三负三正和为0
'固定部分 1 7 8 -9 -5 -2
arr_magic(1, 1) = 1
arr_magic(1, 2) = -3
arr_magic(1, 3) = -4
arr_magic(1, 4) = 10
arr_magic(1, 5) = -6
arr_magic(1, cn) = 2
arr_magic(2, 1) = 7
arr_magic(3, 1) = 8
arr_magic(4, 1) = -9
arr_magic(5, 1) = -5
arr_magic(cn, 1) = -2
arr_magic(cn, cn) = -1
'每增加4个数,可用前面的解法处理(1 4=2 3)
For i = 6 To cn - 1
imark = (-1) ^ Int((((i - 5) Mod 4) / 2))
arr_magic(1, i) = imark * (5 i)
arr_magic(i, 1) = imark * (cn - 1 i)
Next
'右下角=左上角的负数
For i = 1 To cn - 2
arr_magic(cn, i 1) = -arr_magic(1, i 1)
arr_magic(i 1, cn) = -arr_magic(i 1, 1)
Next
For i = 1 To cn
For j = 1 To cn
If arr_magic(i, j) < 0 Then
arr_magic(i, j) = cn * cn 1 arr_magic(i, j)
End If
Next
Next
Else
'奇数阶解法
i = Int(cn / 2) 1
j = cn
For k = 1 To cn * cn
arr_magic(i, j) = k
If k Mod cn = 0 Then
j = (j - 1) Mod cn
Else
i = (i - 1) Mod cn
j = (j 1) Mod cn
End If
If i = 0 Then
i = cn
End If
If j = 0 Then
j = cn
End If
Next
End If
End If
ThisWorkbook.Sheets("幻方").Range(Cells(4, 8), Cells(cn 4, cn 8)) = arr_magic
End Sub
6.总结
通解可以从简单的3,4阶开始研究,后面的最好可以转化为前面的解法。
奇数的解法可以尝试不同的初始点1和不同的方向,四边的四个中点,一个点有2个方向,占用格后也有2种填法,最少有16种方法可行。
奇数阶多种解法导图
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved