⑴ 魔术方阵 的算法
以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是按照固定的算法来生成的,所以你每次调用得到的结果都是相同的。
你可以通过以下几种方式来得到幻方矩阵的其它形式:
上下翻转(flipud);
左右翻转(fliplr);
转置(transpose)。
可以检验,除用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,等等等等。很容易想出。
你给出的这个幻方的一个变形就是充满神秘色彩的洛书上的图形,只不过数字是用圆点表示的。
将其推广,还有四阶幻方,五阶幻方,等等。非常有趣!!