任意階魔方陣算法(c語言)_第1頁
任意階魔方陣算法(c語言)_第2頁
任意階魔方陣算法(c語言)_第3頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、任意階魔方陣算法2009-03-19 11:45:00|分類:我的文章|字號中小 訂閱C 寫了出來。供大家分亨。1、奇數(shù)階幻方n 為奇數(shù) (n=3,5,7,9,11) (n=2*k+1,k=1,2,3,4,5)奇數(shù)階幻方最經(jīng)典的填法是羅伯特法(也有人稱之為樓梯方)。填寫方法是這樣:把1(或最小的數(shù))放在第一行正中; 按以下規(guī)律排列剩下的n*n-1個數(shù):、每一個數(shù)放在前一個數(shù)的右上一格;、如果這個數(shù)所要放的格已經(jīng)超出了頂行那么就把它放在底行,仍然要放在右一列;(4)、如果這個數(shù)所要放的格已經(jīng)超出了頂行且超出了最右列,那么就把它放在前一個數(shù)的 下一行同一列的格內;(5)、如果這個數(shù)所要放的格已經(jīng)有

2、數(shù)填入,處理方法同(4)。這種寫法總是先向“右上”的方向,象是在爬樓梯。2、雙偶階幻方n 為偶數(shù),且能被4整除 (n=4,8,12,16,20) (n=4k,k=1,2,3,4,5)先說明一個定義:互補:如果兩個數(shù)字的和,等于幻方最大數(shù)和最小數(shù)的和,即 n*n+1,稱為互補。先看看4階幻方的填法:將數(shù)字從左到右、從上到下按順序填寫:1 2 3 45 6 7 89 10 11 1213 14 15 16這個方陣的對角線,已經(jīng)用藍色標出。將對角線上的數(shù)字,換成與它互補的數(shù)字。這里,n*n+1 = 4*4+1 = 17;把117-1 = 617-6 = 17-11 = 換完后就是一個四階幻方。16

3、2 3 135 11 10 89 7 6 124 14 15 1n=4k 4*4k*k 個方陣。因為 n 是44*48階幻方的作法:4*42*2個小方陣1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 4849 50 51 52 53 54 55 5657 58 59 60 61 62 63 64每個小方陣對角線上的數(shù)字,換成和它互補的數(shù)。64 2 3 61 60 6 7 579 55 54

4、12 13 51 50 1617 47 46 20 21 43 42 2440 26 27 37 36 30 31 3332 34 35 29 28 38 39 2541 23 22 44 45 19 18 4849 15 14 52 53 11 10 568 58 59 5 4 62 63 13、單偶階幻方n 4這是三種里面最復雜的幻方。以 n=10為例。這時,k=2把方陣分為四個象限,這樣每一個象限肯定是奇數(shù)階。用樓梯法,依次在A 象限,D 象限,B 象限,C 象限按奇數(shù)階幻方的填法填數(shù)。ABCD17 24 1 8 15 67 74 51 58 6523 5 7 14 16 73 55 5

5、7 64 664 6 13 20 22 54 56 63 70 7210 12 19 21 3 60 62 69 71 5311 18 25 2 9 61 68 75 52 5992 99 76 83 90 42 49 26 33 4098 80 82 89 91 48 30 32 39 4179 81 88 95 97 29 31 38 45 4785 87 94 96 78 35 37 44 46 2886 93 100 77 84 36 43 50 27 34A k A 出最左邊的k 格。17 24 1 8 15 67 74 51 58 6523 5 7 14 16 73 55 57 6

6、4 664 6 13 20 22 54 56 63 70 7210 12 19 21 3 60 62 69 71 5311 18 25 2 9 61 68 75 52 5992 99 76 83 90 42 49 26 33 4098 80 82 89 91 48 30 32 39 4179 81 88 95 97 29 31 38 45 4785 87 94 96 78 35 37 44 46 2886 93 100 77 84 36 43 50 27 34將這些格,和C象限相對位置上的數(shù),互換位置。92 99 1 8 15 67 74 51 58 6598 80 7 14 16 73 55

7、 57 64 664 6 88 95 22 54 56 63 70 7285 87 19 21 3 60 62 69 71 5386 93 25 2 9 61 68 75 52 5917 24 76 83 90 42 49 26 33 4023 5 82 89 91 48 30 32 39 4179 81 13 20 97 29 31 38 45 4710 12 94 96 78 35 37 44 46 2811 18 100 77 84 36 43 50 27 34在 B 象限任一行的中間格,自右向左,標出k-1列。(階幻方由于k-1=0再作BD )92 99 1 8 15 67 74 51

8、 58 6598 80 7 14 16 73 55 57 64 664 6 88 95 22 54 56 63 70 7285 87 19 21 3 60 62 69 71 5386 93 25 2 9 61 68 75 52 5917 24 76 83 90 42 49 26 33 4023 5 82 89 91 48 30 32 39 4179 81 13 20 97 29 31 38 45 4710 12 94 96 78 35 37 44 46 2811 18 100 77 84 36 43 50 27 34B 象限標出的這些數(shù),和D象限相對位置上的數(shù)進行交換,即可完成。92 99 1

9、 8 15 67 74 26 58 6598 80 7 14 16 73 55 32 64 664 6 88 95 22 54 56 38 70 7285 87 19 21 3 60 62 44 71 5386 93 25 2 9 61 68 50 52 5917 24 76 83 90 42 49 51 33 4023 5 82 89 91 48 30 57 39 4179 81 13 20 97 29 31 63 45 4710 12 94 96 78 35 37 69 46 2811 18 100 77 84 36 43 75 27 34程序:#include stdio.h #incl

10、ude iostream.h/奇數(shù)階魔方陣算法void pmagic(int *magic,int N,int start)int i,j,k; for(i=0;iN*N;i+) magic=0;for(i=start;istart+N*N;i+)if(i=start) j=0;k=N/2;elsej=j-1; k=k+1;if(jN-1)j=1;k=N-1;if(jN-1)k=0;while(magicj*N+k!=0)j=j+2;k=k-1;magicj*N+k=i;/打印方陣void printT(int *magic,int N)int i,j; for(i=0;iN;i+)for(j

11、=0;jN;j+)coutmagici*N+jt;coutendl;/元素交換函數(shù)void swapT(int *a1,int *a2,int q)int temp; temp=a1; a1=a2; a2=temp;/主程序void int N;int i,j,k,p,q1,q2; int *magic;docout請輸入魔方陣的階數(shù)NN;while(N3)cout你輸入的數(shù)字有誤,請重新輸入!N;magic=new int; if(N%2!=0)pmagic(magic,N,1); printT(magic,N);else if(N%4=0)for(i=1;i=N*N;i+)magici-1

12、=i; k=N/4;j=0;/對角線元素互補for(i=0;ik;i+)for(j=0;jk;j+)for(p=0;p4;p+)q1=4*i*N+4*j+p*(N+1); q2=4*i*N+4*j+p*N+3-p; magicq1=N*N+1-magicq1; magicq2=N*N+1-magicq2;printT(magic,N);else k=N/2;int *a1=new int; int *a2=new int; int *a3=new int; int *a4=new int;pmagic(a1,k,1); pmagic(a4,k,k*k+1); pmagic(a2,k,2*k*k+1); pmagic(a3,k,3*k*k+1); p=N/4;/1,3象限的數(shù)據(jù)互換for(i=0;ik;i+)if(i=k/2)for(j=0;jk/2;j+)swapT(a1,a3,i*k+i+j);elsefor(j=0;jk/2;j+)swapT(a1,a3,i*k+j);/2,4象限的數(shù)據(jù)互換for(i=0;ik;i+)for(j=0;jp-1;j+)swapT(a2,a4,i*k+k/2-j);/for(i=0;iN;i+)fo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論