導航:首頁 > 源碼編譯 > 魔術方陣演算法

魔術方陣演算法

發布時間:2022-05-25 07:10:25

⑴ 魔術方陣 的演算法

以N(沒有偶階魔方)階魔方為例,首先第一行的中間數為1,下一個數

如果不是N的倍數加1,列加1,行減1(如果列大於N,則列減N,如果行小於0則行加N)
如果是N的倍數加1,則行加1(如果行大於N,則行減N)

程序如下:
#include "stdio.h"
void magicsquare(int n)
{
int i,j,k,a[16][16];
for(i=0;i<16;i++) //初始化方陣
for(j=0;j<16;j++)
a[i][j]=0;

i=0;j=(n-1)/2; //第一行中間的數為1
a[i][j]=1;

for(k=2;k<=n*n;k++)
{
if((k-1)%n==0) //是N的倍數加1
{
i++; //行加1
if(i>n-1)
i-=n;
a[i][j]=k;
}
else //不是N的倍數加1
{
i--;j++; //行減1,列加1
if(i<0)
i+=n;
if(j>n-1)j-=n;
a[i][j]=k;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}

int main()
{
int n;
printf("Enter n:");
while(scanf("%d",&n)&&n!=0)
if(n%2) //沒有偶價魔方
magicsquare(n);
return 0;
}

⑵ 魔術矩陣 是什麼矩陣

魔術矩陣

數字1~9填到三行三列的表格中,要求每行、每列、及兩條對角線上的和都相等。

歷史

魔方又稱幻方、縱橫圖、九宮圖,最早記錄於我國古代的洛書。據說夏禹治水時,河南洛陽附近的大河裡浮出了一隻烏龜,背上有一個很奇怪的圖形,古人認為是一種祥瑞,預示著洪水將被夏禹王徹底制服。後人稱之為"洛書"或"河圖",又叫河洛圖。

南宋數學家楊輝,在他著的《續古摘奇演算法》里介紹了這種方法:只要將九個自然數按照從小到大的遞增次序斜排,然後把上、下兩數對調,左、右兩數也對調;最後再把中部四數各向外面挺出,幻方就出現了。 (摘自《趣味數學辭典》)

在西方,阿爾布雷特·丟勒於1514年創作的木雕《憂郁》是最早關於魔方矩陣的記載。有學者認為,魔方矩陣和風靡一時的煉金術有關。幾個世紀以來,魔方矩陣吸引了無數的學者和數學愛好者。本傑明·富蘭克林就做過有關魔方矩陣的實驗。

⑶ 魔方陣演算法是怎麼解出來的

麻煩少少,其實你在網上也可以找到些,種類繁多。

奇數用的是常用的斜線填數法

偶數的演算法是:
當n為4的倍數時:採用對稱元素交換法。首先把數1-n^2按行從上至下,從左至右填人方陣的n×n格。然後,把方陣的所有4 ×4子方陣中的兩對角線上位置上的數固定下來不動;所有其它位置上的數關於方陣中心作對稱交換,也就是把元素a(i,j)與元素a(n+1-i,n+ 1-j)的值交換。

當n為非4倍數的偶數(即4m+2形)時:首先把大方陣分解為4個奇數(2m+1階)子方陣。上述奇數階魔方給分解的4個子方陣對應賦值,上左子方最小(i),下右子次小(i+v),下左子方最大(i+3v),上右子方次大(i+2v),即4個子方陣對應元素相差v,其中v=n*n/4,然後作相應的元素交換:
a(i,j)與a(i+u,j)在同一列做對應交換(j<t或j>n-t+2)
a(t,1)與a(t+u,1);a(t,t)與a(t+u,t)兩對元素交換
其中u=n/2,t=(n+2)/4

我寫的程序:(比較傻的方法,因為昨天太晚了不想優化了:P)

include <stdio.h>
#define N 100

void main()
{
void n1(int n);
void n2(int n);
void n3(int n);
int n;
printf("please input n:");
scanf("%d",&n);
printf("\n");
if((n%2)!=0)
n1(n);
else if((n%4)==0)
n2(n);
else
n3(n);
getch();
}

void n1(int n)
{
int i,j,count=0,num[N][N];
for(i=0,j=(n-1)/2;count<n*n;)
{
count++;
num[i][j]=count;
if(count%n==0)
{
i++;
}
else
{
i--;
j++;
}
if(i<0)
i+=n;
if(j>=n)
j-=n;
}
count=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%5d",num[i][j]);
count++;
if(count%n==0)
printf("\n");
}
}

void n2(int n)
{
int t,i,j,count=0,num[N][N];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
count++;
num[i][j]=count;
}
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{
if(i!=j)
{
t=num[i][j];
num[i][j]=num[n-1-i][n-1-j];
num[n-1-i][n-1-j]=t;
}
}
count=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%5d",num[i][j]);
count++;
if(count%n==0)
printf("\n");
}
}

void n3(int n)
{
int i,j,m,t,v,count=0,num[N][N];
v=(n+2)/4;
m=n/2;
for(i=0,j=(m-1)/2;count<m*m;)
{
count++;
num[i][j]=count;
if(count%m==0)
i++;
else
{
i--;
j++;
}
if(i<0)
i+=m;
if(j>=m)
j-=m;
}
for(i=m,j=(m-1)/2+m;count<2*m*m;)
{
count++;
num[i][j]=count;
if(count%m==0)
i++;
else
{
i--;
j++;
}
if(i<m)
i+=m;
if(j>=2*m)
j-=m;
}
for(i=0,j=(m-1)/2+m;count<3*m*m;)
{
count++;
num[i][j]=count;
if(count%m==0)
i++;
else
{
i--;
j++;
}
if(i<0)
i+=m;
if(j>=2*m)
j-=m;
}
for(i=m,j=(m-1)/2;count<4*m*m;)
{
count++;
num[i][j]=count;
if(count%m==0)
i++;
else
{
i--;
j++;
}
if(i<m)
i+=m;
if(j>=m)
j-=m;
}
for(i=0;i<m;i++)
{
for(j=0;j<v-1||j>n-v+1;j++)
{
t=num[i][j];
num[i][j]=num[i+m][j];
num[i+m][j]=t;
}
for(j=n-v+2;j<n;j++)
{
t=num[i][j];
num[i][j]=num[i+m][j];
num[i+m][j]=t;
}
}
t=num[v-1][0];
num[v-1][0]=num[v+m-1][0];
num[v+m-1][0]=t;
t=num[v-1][v-1];
num[v-1][v-1]=num[v+m-1][v-1];
num[v+m-1][v-1]=t;
count=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%5d",num[i][j]);
count++;
if(count%n==0)
printf("\n");
}
}

⑷ 誰知道魔術方陣的規律啊!~

我可以說說演算法.前提我說的魔方為奇數時的演算法,偶數的沒有想出來.即N=2*K-1;
先把1放在第一的行的N\2處.然後把2放在1的上一行,下一列,依次類退;如果你放數時,發現有數則把這個數放在上個數的上面.假如你在排完3時要排4時,根據上面的方法你要把4放在3的上一行下列,如果那地方已經排了數你就把4放在3的上面.就這簡單!!!!!!!!

⑸ 魔術方陣的歷史

根據「論說」和「星子」中的記載,傳說大約在三千年前, 夏禹治水時, 在洛水裡出現了一隻大烏龜, 龜背上刻有奇特的圖案,人們將他取名為洛書。
這個方陣具有一個奇特的性質,那就是每一行、每一列以及對角線上的數字和都是15。祖先們認為洛書是一個吉祥的象徵,所以許多人都將他畫在紙上攜帶,認為有保平安的效果。
在別的東方地區也有幻方的記載,但多數也蒙上神秘的色彩。較早期的一個,是刻在印度一所廟宇的石上,年代大約是十一世紀,是個4階幻方。古代印度的人民十分崇拜這種幻方,至今從古神殿的遺址、墓碑上常常還可以發現四階幻方的遺跡,至今還有許多印度人把「洛書」的圖案佩在胸前當作護身符。
由於洛書共有九個數字,所以漢代的徐岳把他稱為九宮算 (或九宮圖) 。九宮算在漢代之後又有很大的擴展,成為縱橫均為n行的縱橫圖。而公元十世紀宋朝時,有人將「九宮」和「洛出書」合稱為「洛書」。
1275年,中國數學家揚揮在古摘奇演算法中更進一步模仿洛書,計算出了五五幻方、六六幻方....九九幻方及百子幻方 (十階幻方) 等。後來程大位在1593年於演算法統宗中繼承了揚輝的工作又作出十四個幻方,而張潮更將幻方推廣到正立方體上。
十二世紀的阿拉伯文獻里也有六階幻方的記載,我國考古學家曾經在西安也發現了五塊鐵板,上面刻有當時阿拉伯文獻上的五個六階幻方,也說明了我國與阿拉伯數學文化交流的情況。右圖即五個六階幻方中的一個。
直到西元13世紀時,東羅馬帝國的希臘數學家才對幻方產生興趣,但是成果不多。
在公元15世紀時,住在君士坦丁堡的魔索普拉把我國的縱橫圖介紹給歐洲人,並取名為magic square,因為縱橫圖具有如此變幻莫測的特別性質,所以在歐洲也掀起了一段占星的風潮,中古世紀的歐洲人也認為幻方具有符的法力,能夠鎮壓妖魔,許多歐洲寺院中的神殿都使用他,而許多佔星術師也將其作為護身符。

⑹ 魔方矩陣的Java版的魔方矩陣演算法

/***魔術矩陣,也被稱為魔方矩陣。目前魔術矩陣主要有三種結構:N為奇數、N為4的倍數、N為其它偶數(4n+2)。<br/>*其中目前很多數學家都還在研究「N為4的倍數」、「N為其它偶數(4n+2)」,可見它們對於初學者而言太難。<br/>*因此此處演示的代碼,僅僅考慮N為奇數的情況。<br/>*此代碼作為課件提供給學生參考,在學完數組、循環、判斷後練習。<br/>*@authorluo_wenqiang在126點com*@version1.0.0*/classMagicArray{publicstaticvoidmain(String[]args){/*1.把1放在第一行的最中間2.每個數字向右上角填充3.如果往右已經是最大數了,就從最左邊重新繼續4.如果往上已經是最大數了,就從最下邊重新繼續5.如果遇到行數的整數倍,則下一個數直接放到該數的下面*//*1.聲明一個n*n二維數組2.聲明一個int類型的變數記錄每個元素遞增的值,每次自加即可3.需要一個嵌套循環來填充二維數組3.1.把橫向的索引認為x,x=n/23.2.把縱向的所應認為y,y=03.3.在循環中,先把x、y坐標上的值填充,然後計算下一個坐標*/intn=3;int[][]array=newint[n][n];intcounter=1;//自加的計數器intx=n/2;inty=0;//二維數組,需要用兩層的嵌套循環來完成比較簡單for(inti=0;i<n*n;i++){//根據坐標填充值array[y][x]=counter;//計算下一個坐標的位置if(counter%n==0){//如果counter是n的整數倍,下一個坐標是在當前數字的下面y++;}else{x++;y--;if(y<0){//如果y超出范圍,把y設置成最大y=n-1;}if(x==n){//如果x超出范圍,把x設置成最小x=0;}}//使用完以後計數器需要自加counter++;}for(int[]row:array){for(inti:row){System.out.print(i);System.out.print( );}System.out.println();}}}

⑺ matlab中魔術矩陣magic()為何每次得到的都是一個矩陣,同一階的魔術矩陣不是應該有好幾個嗎

建議樓上的回答問題之前多想一想,不了解的東西盡量不要想當然,以免誤人誤己。

同一階的幻方矩陣當然不止一個,但MATLAB是按照固定的演算法來生成的,所以你每次調用得到的結果都是相同的。

你可以通過以下幾種方式來得到幻方矩陣的其它形式:

可以檢驗,除用magic函數直接得到的幻方矩陣之外,另外還有7種形式:

m=magic(4)
flipud(m)
fliplr(m)
transpose(m)
flipud(fliplr(m))
flipud(transpose(m))
fliplr(transpose(m))
flipud(fliplr(transpose(m)))

⑻ 魔術方陣的建構方法

魔術方陣要滿足各行各列各對角線之和相等的條件,是否有簡單的方法可以達到這個目標呢? 以下我們就來探討一下有關魔術方陣建構的問題. 一開始我們由三階的魔術方陣做起,魔術方陣是一個有趣的數學問題,不過如果我們嚴肅的看他,其實魔術方陣就是一個滿足許多簡單數字和條件的一種方陣。假使我們將一個三階的魔術方陣用八個等式表現出來。
三階幻方建構:九子斜排,上下對異,左右相更,四維挺出, 戴九履一,左三右七,二四為肩,六八為足. 三階幻方建構種類有8種,由幻方的旋轉,我們可以得到四種變化: 0度 90度 180度 270度 四種旋轉 若將幻方整個翻轉過來,又可以的到另外的四個不同的幻方,其他7個幻方: 原方陣 8 1 6 3 5 7 4 9 2 90度 4 3 8 9 5 1 2 7 6 180度 2 9 4 7 5 3 6 1 9 270度 6 7 2 1 5 9 9 3 4 鉛直 6 1 8 7 5 3 2 9 4 水平 4 9 2 3 5 7 8 1 6 左上右下 8 3 4 1 5 9 6 7 2 右上左下 2 7 6 9 5 1 4 3 8 接下來我們來探討一下四階方陣的建構方法。首先我們觀察一下變數以及已之條件的變化情形。四階幻方的已之條件有10條(各行各列各對角線之和等於魔數),但是四階幻方的變數卻有16個之多。由此可知我們如果要利用像三階幻方那樣的暴力解法的話是行不通的。因此我們轉為利用分析的方式來一步一步的建構四階魔術方陣。
1、先把1放在四階幻方4個角的任意一個角格,按同一個方向按順序依次填寫其餘數。
如圖:按行從左向右順序排數。
2、以中心點對稱互換數字。(有兩種對稱交換的方法)1)、以中心點對稱交換對角線上的數(即1-16、4-13、6-11、7-10互換),完成幻方,幻和值=34。2)、以中心點對稱交換非對角線上的數(即2-15、3-14、5-12、8-9互換),完成幻方,幻和值=34。
偶階幻方分兩類: 雙偶數:四階幻方,八階幻方,....,4K階幻方, 可用<對稱交換法>,方法很簡單:
1) 把自然數依次排成方陣
2) 把幻方劃成4*4的小區,每個小區劃對角線,
3) 把這些對角線所劃到的數,保持不動, 4) 把沒劃到的數,按幻方的中心,以中心對稱的方式,進行對調, 幻方完成!
單偶數:六階幻方,十階幻方,....,4K+2階幻方, 方法是很繁的,有一種稱<同心方陣法>:
1) 把幻方分成兩個區,一是邊框一圈,二是裡面一個雙偶數方陣,
2) 把(3+8K)到(16K^2+8K+2)按雙偶數幻方方法填入雙偶數方陣,
3) 把餘下的數,在邊上試填,調整到符合為止.
1、奇數階魔術方陣時,最簡單: 把它叫做n階魔術方陣(n為奇數)
解法:⑴ 將1放在第一行中間一列;
⑵ 從2開始直到n×n止各數依次按下列規則存放:
按 45°方向行走,如向右上
每一個數存放的行比前一個數的行數減1,列數加1
⑶ 如果行列范圍超出矩陣范圍,則回繞。
例如1在第1行,則2應放在最下一行,列數同樣加1;
⑷ 如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,
則把下一個數放在上一個數的下面。
例如:5階魔術方陣:

⑼ 什麼是魔方矩陣

魔術矩陣是由一個n×n(n為奇數)的整數矩陣構成,矩陣中的整數值是從1~n^2[n的平方]。每一行,每一列和兩個對角線上數值之和是一樣的。

下面我以n=5的魔術矩陣為例,給出詳細的說明

15
8
1
24
17

16
14
7
5
23

22
20
13
6
4

3
21
19
12
10

9
2
25
18
11

這個n為5的魔術矩陣,他的每一行,每一列,兩個對角線的和均為65

演算法設計:

先在矩陣第一行中間的位置上放1,然後把數字按照升序沿著左上角放置到矩陣中。如果越界了,就假設周圍還有一個矩陣,將數字放到那個位置上;如果那個位置已經被占據了,就跳過該位置放到下面的位置,然後重新按照原來的方法放。如圖:在5×5的魔術矩陣中,放完1以後,就把2放到1的左上角,但是此時已經越界了。假設,在原來的矩陣上面還有一個矩陣,則數字2所放的位置應該是在最後一行的第二個位置,接下去就要把數字3放到2的左上角,依次放下去,當放到6的時候,由於1已經將下一個位置佔了,所以就放到5下面的位置。依照這樣的規律直到把數字都放完。

程序設計:

#include
#define Max_Size 15
void main()
{
static int square[Max_Size][Max_Size];
int i,j,row,column,count,size;
printf("輸入的矩陣大小:\n");
scanf("%d",&size);
if(size<1||size>Max_Size+1)
{
printf("輸入的矩陣太大!");
//exit(1);
}
if(!(size % 2))
{
printf("大小不能為偶數");
//exit(1);
}
for(i=0;i for(j=0;j square[i][j] = 0;
square[0][(size-1)/2] = 1;
i = 0;
j = (size-1)/2;
for(count=2;count<=size*size;count++)
{
row = (i-1<0)?(size-1):(i-1);
column=(j-1<0)?(size-1):(j-1);
if(square[row][column])
i=(++i)%size;
else
{
i = row;
j = (j-1<0)?(size-1):--j;
}
square[i][j] = count;
}
printf("大小為%d的魔術矩陣為:\n",size);
for(i=0;i {
for(j=0;j {
printf("%4d",square[i][j]);
}
printf("\n");
}

}

程序輸出:

輸入的矩陣大小:

5

大小為5的魔術矩陣為:

15 8 1 24 17

16 14 7 5 23

22 20 13 6 4

3 21 19 12 10

9 2 25 18 11

⑽ 現想做—個和數為16的魔術方陣,要求方陣中的9個數字全不相同,想一想應該怎樣做

這是一個三階幻方。
樓上說的對。要使和為16,那麼這九個數字不能要求全是整數,因為三階幻方的幻和就是15。
由於這九個數不會全為整數,那麼這道題的答案有無數個。比如,原來的每個數都乘以16/15,等等等等。很容易想出。
你給出的這個幻方的一個變形就是充滿神秘色彩的洛書上的圖形,只不過數字是用圓點表示的。
將其推廣,還有四階幻方,五階幻方,等等。非常有趣!!

閱讀全文

與魔術方陣演算法相關的資料

熱點內容
安卓軟體怎麼還原之前的版本 瀏覽:869
什麼app可以看舌神綜藝 瀏覽:278
vba編好的程序編譯出來 瀏覽:91
如何清空伺服器數據 瀏覽:33
android計劃軟體 瀏覽:383
vivo手機文件夾加密路徑 瀏覽:131
程序員怎麼找到聯通卡 瀏覽:196
單片機實訓要求 瀏覽:268
程序員八大黑話 瀏覽:946
除了天天鑒寶app還有什麼 瀏覽:628
cs中的文件夾 瀏覽:792
php獲取內存地址 瀏覽:679
看電視直播節目什麼app最好 瀏覽:30
如何連子文件裡面的文件一起解壓 瀏覽:72
怎麼用單片機識別天氣 瀏覽:877
單片機實驗室認識 瀏覽:142
我的世界pe112伺服器地址 瀏覽:886
程序員轉行銷售 瀏覽:468
沈陽醫療程序員 瀏覽:47
戴爾伺服器主機系統如何安裝 瀏覽:958