常見程式演算:: 2(2N+1) 魔方陣

文章推薦指數: 80 %
投票人數:10人

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



請為這篇文章評分?