常見程式演算:: 奇數魔方陣 - OpenHome.cc

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

解法思路 OPENHOME.CC 常見程式演算 |老掉牙 河內塔 費氏數列 巴斯卡三角形 三色旗 老鼠走迷宮 騎士走棋盤 八皇后 八銀幣 康威生命遊戲 字串比對 背包問題 雙色、三色河內塔 得分排行 |「數」 最大訪客數 Eratosthenes篩選求質數 完美數 阿姆斯壯數 大數運算 指定位數的圓周率 |隨機 蒙地卡羅法求PI 洗牌 Craps賭博遊戲 約瑟夫問題 |組構 排列 格雷碼 子集 k組合 因數分解 加法因子 |排序 選擇、插入、氣泡排序 Heap排序-改良的選擇排序 Shell排序-改良的插入排序 Shaker排序-改良的氣泡排序 快速排序(一) 快速排序(二) 合併排序 基數排序 |搜尋 線性搜尋 二分搜尋 插補搜尋 費氏搜尋 |矩陣 稀疏矩陣 多維矩陣降維 上/下三角、對稱矩陣 奇數魔方陣 4N魔方陣 2(2N+1)魔方陣 |運算 中序式轉後序式 後序式運算 Quine GitHub Twitter Facebook LinkedIn Designs Tags BuiltwithbyHugo HOME> 常見程式演算> 矩陣> 奇數魔方陣 解法思路 程式實作 magicsquare matrix C Java Python Scala Ruby JavaScript Haskell 奇數魔方陣 December12,2021 奇數魔方陣是將1到奇數n的數字排列在nxn的方陣,各行、各列與各對角線的和必須相同: 17241815 23571416 46132022 101219213 11182529 解法思路 奇數魔方陣最簡單,第一個數字放在第一行第一列的中央,然後向右(左)上填,如果右(左)上已有數字就向下填,如所示: 為了計算方便,利用索引1到n的部份,在計算是向右(左)上或向下時,可以將索引值除以n值,如果得到餘數為1就向下,否則就往右(左)上,原理很簡單,看看是不是已經在同一列上繞一圈就對了。

程式實作 C Java Python Scala Ruby JavaScript Haskell #include #include #defineN5 intmain(void){ intmatrix[N][N]={0}; inti=0; intj=(N+1)/2; intkey; for(key=1;key<=N*N;key++){ if((key%N)==1) i++; else{ i--; j++; } if(i==0) i=N; if(j>N) j=1; matrix[i-1][j-1]=key; } intm,n; for(m=0;mn)j=1; matrix[i-1][j-1]=key; } returnmatrix; } publicstaticvoidmain(String[]args){ for(int[]row:Matrix.magic(5)){ for(intnumber:row){ System.out.printf("%2d",number); } System.out.println(); } } } defmagic(n): square=[] foriinrange(n): square.append([0]*n) i=0 j=(n+1)//2 forkeyinrange(1,n**2+1): ifkey%n==1: i+=1 else: i-=1 j+=1 ifi==0: i=n ifj>n: j=1 square[i-1][j-1]=key returnsquare matrix=magic(5) print(matrix) objectMatrix{ defmagic(n:Int)={ valmatrix=newArray[Array[Int]](n,n) vari=0 varj=(n+1)/2 for(keyn)j=1 matrix(i-1)(j-1)=key } matrix } } Matrix.magic(5).foreach(row=>{ row.foreach(number=>printf("%2d",number)) println() }) defmagic(n) matrix=Array.new(n){ Array.new(n,0) } i=0 j=(n+1)/2 1.upto(n**2){|key| ifkey%n==1 i+=1 else i-=1 j+=1 end ifi==0 i=n end ifj>n j=1 end matrix[i-1][j-1]=key } matrix end matrix=magic(5) pmatrix functionmagic(n){ letmatrix=[]; for(leti=0;in){ j=1; } matrix[i-1][j-1]=key; } returnmatrix } matrix=magic(5) console.log(matrix) slice::Int->Int->[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 magicn= let matrix=replicaten$replicaten0 in_magic0((n+1)`div`2)1nmatrix where _magicijkeynmatrix= ifkey==n*n+1thenmatrix else let (ni,nj)=nijijkeyn nMatrix=updated(ni-1)(nj-1)keymatrix in_magicninj(key+1)nnMatrix nijijkeyn= ifkey`mod`n==1then(i+1,j) else let ni=i-1 nj=j+1 in(ifni==0thennelseni,ifnj>nthen1elsenj) main=print$magic5



請為這篇文章評分?