2(2N+1) 魔方陣的維度整體來看是偶數,然而可以分解為奇數乘以偶數,例如6 x 6 方陣,其中6 = 2 X 3,也稱這種方陣為單偶數(oddly-even)方陣,
OPENHOME.CC
常見程式演算
|老掉牙
河內塔
費氏數列
巴斯卡三角形
三色旗
老鼠走迷宮
騎士走棋盤
八皇后
八銀幣
康威生命遊戲
字串比對
背包問題
雙色、三色河內塔
得分排行
|「數」
最大訪客數
Eratosthenes篩選求質數
完美數
阿姆斯壯數
大數運算
指定位數的圓周率
|隨機
蒙地卡羅法求PI
洗牌
Craps賭博遊戲
約瑟夫問題
|組構
排列
格雷碼
子集
k組合
因數分解
加法因子
|排序
選擇、插入、氣泡排序
Heap排序-改良的選擇排序
Shell排序-改良的插入排序
Shaker排序-改良的氣泡排序
快速排序(一)
快速排序(二)
合併排序
基數排序
|搜尋
線性搜尋
二分搜尋
插補搜尋
費氏搜尋
|矩陣
稀疏矩陣
多維矩陣降維
上/下三角、對稱矩陣
奇數魔方陣
4N魔方陣
2(2N+1)魔方陣
|運算
中序式轉後序式
後序式運算
Quine
GitHub
Twitter
Facebook
LinkedIn
Designs
Tags
BuiltwithbyHugo
HOME>
常見程式演算>
矩陣>
2(2N+1)魔方陣
解法思路
程式實作
magicsquare
matrix
C
Java
Python
Scala
Ruby
JavaScript
Haskell
2(2N+1)魔方陣
December12,2021
2(2N+1)魔方陣的維度整體來看是偶數,然而可以分解為奇數乘以偶數,例如6x6方陣,其中6=2X3,也稱這種方陣為單偶數(oddly-even)方陣,各行、各列與各對角線的和必須相同。
解法思路
首先令n=2*(2*m+1),並將整個方陣看靈數個奇數方陣的組合:
先依序將A、B、C、D四個位置,依奇數魔方陣規則填入數字,填完後方陣中各行和就相同了,但列與對角線則否,此時必須在A-D與C-B之間調換,規則如下:
將A中每列(中間列除外)頭m個元素,與D中對應位置元素調換。
將A的中央列、中央那一格向左取m格,並與D中對應位置對調。
將C中每列的倒數m-1個元素,與B中對應元素對調。
以6x6方陣為例,先分解為奇數方陣,並填入數字:
接下來進行互換,互換的元素以不同顏色標示:
由於m-1的數為0,在這個例子中,C-B部份不用進行對調。
程式實作
C
Java
Python
Scala
Ruby
JavaScript
Haskell
#include
#include
#defineN6
#defineSWAP(x,y){intt;t=x;x=y;y=t;}
voidmagic_o(int[][N],int);
voidexchange(int[][N],int);
intmain(void){
intsquare[N][N]={0};
magic_o(square,N/2);
exchange(square,N);
inti,j;
for(i=0;i{
row.foreach(number=>printf("%2d",number))
println()
})
defmagic(n)
square=Array.new(n){
Array.new(n,0)
}
magic_o(square,n/2)
exchange(square,n)
square
end
defmagic_o(square,n)
row=0
column=n/2
1.upto(n**2){|count|
square[row][column]=count;#填A
square[row+n][column+n]=count+n*n;#填B
square[row][column+n]=count+2*n*n;#填C
square[row+n][column]=count+3*n*n;#填D
ifcount%n==0
row+=1
else
row=(row==0)?n-1:row-1
column=(column==n-1)?0:column+1
end
}
end
defexchange(x,n)
m=n/4
m1=m-1
(n/2).times{|i|
ifi!=m
m.times{|j|
x[i][j],x[n/2+i][j]=
x[n/2+i][j],x[i][j]
}
m1.times{|j|
x[i][n-1-j],x[n/2+i][n-1-j]=
x[n/2+i][n-1-j],x[i][n-1-j]
}
else
1.upto(m){|j|
x[m][j],x[n/2+m][j]=
x[n/2+m][j],x[m][j]
}
m1.times{|j|
x[m][n-1-j],x[n/2+m][n-1-j]=
x[n/2+m][n-1-j],x[m][n-1-j]
}
end
}
end
matrix=magic(6)
pmatrix
functionmagic(n){
letsquare=[];
for(leti=0;iInt->[a]->[a]
slicestartstopxs=take(stop-start)(dropstartxs)
updatedijvmx=
let
row=mx!!i
updatedRow=(slice0jrow)++[v]++(slice(j+1)(lengthrow)row)
before=slice0imx
after=slice(i+1)(lengthmx)mx
inbefore++[updatedRow]++after
swappedijklmx=
updatedkl(mx!!i!!j)$updatedij(mx!!k!!l)mx
exchangednmx=
letm=n`div`4
m1=m-1
in_exchanged(n`div`2)mm1n0mx
where
_exchangedstopmm1nimx=
ifi==stopthenmx
else
ifi/=mthen_exchangedstopmm1n(i+1)$rule2m1in$rule1minmx
else_exchangedstopmm1n(i+1)$rule32m1mn$rule31mnmx
rule1minmx=
_forSwappedmi0nmx
where
_forSwappedstopijnmx=
ifj==stopthenmx
else_forSwappedstopi(j+1)n$swappedij(n`div`2+i)jmx
rule2m1inmx=
_forSwappedm1i0nmx
where
_forSwappedstopijnmx=
ifj==stopthenmx
else_forSwappedstopi(j+1)n$swappedi(n-1-j)(n`div`2+i)(n-1-j)mx
rule31mnmx=
_forSwapped(m+1)m1nmx
where
_forSwappedstopmjnmx=
ifj==stopthenmx
else_forSwappedstopm(j+1)n$swappedmj(n`div`2+m)jmx
rule32m1mnmx=
_forSwappedm1m0nmx
where
_forSwappedstopmjnmx=
ifj==stopthenmx
else_forSwappedstopm(j+1)n$swappedm(n-1-j)(n`div`2+m)(n-1-j)mx
magic0nmx=_magic00(n`div`2)n1mx
where
_magic0rowcolumnncountermx=
letnn=n*n
in
ifcounter==nn+1thenmx
else
let
nmx=updated(row+n)column(counter+3*nn)$
updatedrow(column+n)(counter+2*nn)$
updated(row+n)(column+n)(counter+nn)$
updatedrowcolumncountermx
(nr,nc)=_nrccounternrowcolumn
in_magic0nrncn(counter+1)nmx
where
_nrccounternrowcolumn=
ifcounter`mod`n==0then(row+1,column)
else(ifrow==0thenn-1elserow-1,ifcolumn==n-1then0elsecolumn+1)
magicn=
letmatrix=replicaten$replicaten0
inexchangedn$magic0(n`div`2)matrix
main=print$magic6