麻烦少少,其实你在网上也可以找到些,种类繁多。
奇数用的是常用的斜线填数法
偶数的算法是:
当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为4的倍数时:采用对称元素交换法。首先把数1-n^2按行从上至下,从左至右填人方阵的n×n格。然后,把方阵的所有4 ×4子方阵中的两对角线上位置上的数固定下来不动;所有其它位置上的数关于方阵中心作对称交换,也就是把元素a(i,j)与元素a(n+1-i,n+ 1-j)的值交换。
如何输出魔方阵
如3×3的魔方阵: 8 1 6 3 5 7 4 9 2 魔方阵的排列规律如下: (1)将1放在第一行中间一列; (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列); (3)如果上一个数的...
求问这个魔方阵的程序是什么意思?
j=j-1;(和排重的算法一样)}
C语言关于打印n阶魔方阵的编程有几个看不懂的,,求指点啊
第三步,对于双偶阶的魔方阵,构造方法类似于奇数阶,但需要额外的技巧来确保对角线和其余行、列的和相等。一种常见的方法是先构造出一个基本的魔方阵,然后通过适当的位移操作来调整对角线的元素。第四步,对于偶数阶的魔方阵,构造则更为复杂,通常需要特殊的算法来确保所有行、列和对角线的和相等。
四阶魔方容易学的么??
在bbs.mf8.com.cn里面 有详细的教程 简单的说 就是 四阶的魔方 相对三阶的而言 中心块是不固定的 所以 只要先固定中心块 然后把 每个棱上的两个棱块固定 然后按照三阶的复原方法就可以了
魔方阵的算法,用c来实现,多种方法的都可以
前面算法是这样的,证明出处不详 1.先将1放在第一行的中间位置。2.从“2”开始直到N*N止,各数依次按下列规则放数:每个数放的行在前一个数的行数减1,列数加1.3.如果上一个数的行数为1,则下一个数的行数为最后一行。当上一个数的列数为最后一列时,下一个列数为第一列。4.如果下...
算法设计与分析:3阶魔方阵
1、累加和=所有数字和\/行数=(1+n2)*n2\/2n=n(n2+1)\/2 2、这叫幻方 3、奇数阶幻方有构造方法:从1开始,往右斜上顺次填写。特殊情况:如果数字出了幻方,将该数填至行或列的另一端。特殊情况2: 如果要填写的格子被占了,数填在格子下方一格。特殊情况3: 我忘了。
求一个n阶魔方阵的算法用标准c语言的风格来做的
snjsj 我的程序算法:这个魔方阵的算法可以对除2以外的任意阶数的方阵进行输出,结果保存在运行程序的目录下面的Magic.txt文件中,用ie或者写字板打开以保持格式的一致(主要是回车符在记事本中为黑方框,认不出来)。当然具体的程序中,有内存空间以及变量范围的约束,我试过了,100以内的是可以的。偶...
唯一矩阵法数独怎样解?
1.2魔方阵生成算法 奇数阶魔方阵的生成方法如下:(1) 第一个位置在第一行正中;(2) 新位置应当处于最近一个插入位置右上方,但如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置,如超出右边界则新位置取应选行的最左一个位置;(3) 若上一个插入元素为N的整倍数,则选下面一行...
如何把1-25的25个数字填入5乘5的方格中,使横竖数字和相等的规律算法
有一种方法不仅能很快地填出三阶幻方,还能很快地填出五阶幻方、七阶幻方、九阶幻方……那就是“口诀法”口 诀 “1”坐边中间,斜着把数填;出边填对面,遇数往下旋;出角仅一次,转回下格间。注意:(1)这里的“1”,是指要填的这一列数中的第一个数。(2)“1”坐边中间,指第一个...