编程幻方
❶ 幻方 问题 n 幻方编程问题
n(n为奇数)阶幻方实现方法:
⑴ 将1放在第一行中间一列;
⑵ 从2开始直到n×n止各数依次按下列规则存放按45°方向行走,如向右上每一个数存放的行比前一个数的行数减1,列数加1
⑶ 如果行列范围超出矩阵范围,则回绕,例如1在第1行,则2应放在最下一行,列数同样加1; ⑷ 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时则把下一个数放在上一个数的下面。
代码如下:
#include"stdio.h"
#include"math.h"
int a[10][10]; //定义一个二维数组存放数据,大小根据测试的阶数确定
void ins(int n)
{
int x,y,m;
x=0;
y=n/2;
for(m=1;m<=n*n;m++) //依次将1~n*n赋值给二维数组
{
a[x][y]=m;// 将1放在第一行中间一列
if(m%n!=0)
{
x--; // 从2开始直到n×n止各数依次按下列规则存放:按45度方向行走
y++;
if(x<0) // 如果行列范围超出矩阵范围,则回绕
x=x+n;
if(y==n)
y=n-y;
}
else
{
x++;
if(x==n)
x=x-n;
}
}
}
main()
{
int i,j,n;
scanf("%d",&n);//输入阶数
ins(n); //调用函数
for(i=0;i<n;i++) //打印出幻方
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]); //格式化输出
puts(""); //打印2个空行
puts("");
}
getch(); //win_TC下的语句用于停住画面,其他开发环境下无需
}
❷ c语言编程题 标题: 幻方填空 幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数
设每行、列、斜线的个数为n,这n个数的和为S。则正中间位置上的数字=S/n幻方各行、各列及两条对角线所含的n个数的和相等。例子:(三阶幻方,幻和为15,)492357816三阶幻方中间必填5
❸ 六阶幻方怎么解
下面是六阶幻方的其中一个答案:
=================================================
28 4 3 31 35 10
36 18 21 24 11 1
7 23 12 17 22 30
8 13 26 19 16 29
5 20 15 14 25 32
27 33 34 6 2 9
注意:这个幻方的每行每列对角线的六个数之和为111(幻和为111),还有一个特点就是中间的十六个数也构成一个四阶幻方哦,幻和为74。希望满意答案。
=====================================================================
下面介绍一下奇数幻方,双偶,单偶幻方的常见规律。
一、 N 为奇数时,最简单。
(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1
(3) 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
(4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
============================
二、 N为4的倍数时
采用对称元素交换法。
首先把数1到n×n按从上至下,从左到右顺序填入矩阵
然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对
称交换,即a(i,j)与a(n-1-i,n-1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)
===========================
三、N 为其它偶数时
当n为非4倍数的偶数(即4n+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,0)与a(t+u-1,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换
其中u=n/2,t=(n+2)/4 上述交换使每行每列与两对角线上元素之和相等。
=================================================================
下面给出C语言编程实现任意幻方的解答:
========================
#include"stdio.h"
#include"math.h"
int a[256][256];
int sum;
int check();
void ins(int n);
main()
{
int i,j,n,k,t,p,x;
scanf("%d",&n);
sum=(n*n+1)*n/2;
if(n%2==1)//奇数幻方
{
ins(n);
k=n;
}
if(n%4==2)//单偶数幻方
{
k=n/2;
ins(k);
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
a[j+k]=a[j]+2*k*k;
a[i+k][j]=a[j]+3*k*k;
a[i+k][j+k]=a[j]+k*k;
}
t=(n-2)/4;
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
if((j<t)&&(i<t))
{
p=a[j];a[j]=a[i+k][j];a[i+k][j]=p;
}
if((j<t)&&(i>k-t-1))
{
p=a[j];a[j]=a[i+k][j];a[i+k][j]=p;
}
if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2))
{
p=a[j];a[j]=a[i+k][j];a[i+k][j]=p;
}
if(j>1&&j<=t)
{
p=a[j+k];a[j+k]=a[i+k][j+k];a[i+k][j+k]=p;
}
}
}
if(n%4==0)//双偶数幻方
{
x=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[j]=x++;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i%4==0&&abs(i-j)%4==0)
for(k=0;k<4;k++)
a[i+k][j+k]=n*n-a[i+k][j+k]+1;
else if(i%4==3&&(i+j)%4==3)
for(k=0;k<4;k++)
a[i-k][j+k]=n*n-a[i-k][j+k]+1;
}
}
if(check(n)==1)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d",a[j]);
printf("\n");
}
return ;
}
}
int check(int n)//检验是否是幻方
{
int i,j,sum1=0,sum2;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
sum1+=a[j];
if(sum1!=sum) return 0;
sum1=0;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
sum1+=a[j];
if(sum1!=sum) return 0;
sum1=0;
}
for(sum1=0,sum2=0,i=0,j=0;i<n;i++,j++)
{
sum1+=a[j];
sum2+=a[n-j-1];
}
if(sum1!=sum) return 0;
if(sum2!=sum) return 0;
else return 1;
}
void ins(int n)//单偶数幻方的输入
{ int x,y,m;
x=0;y=n/2;
for(m=1;m<=n*n;m++)
{
a[x][y]=m;
if (m%n!=0)
{
x--;y++;
if(x<0) x=x+n;
if(y==n) y=n-y;
}
else
{
x++;
if(x==n) x=x-n;
}
}
}
=====================================
说明:以上C语言程序,复制到TXT文本,然后,另存为XXX.c文件,利用编程软件,编译这个文件,再保持到电脑,以后想用,直接点击就会运行。运行后,可以随意输入一个幻方阶数,就会自动生成一个幻方组合出来。
再说明一点:以上C程序仅供参考,我刚才编译过,因为是中文输入法输入的,所以不通过,需要把上边的标点符号切换到英文输入法,再输入才可以通过编译。
以下程序是可以通过编译,只是奇数幻方的C程序,还有,我命令它阶数范围是1~15阶的奇数幻方。
==================================
#include "stdio.h"
void main()
{
int a[18][18],i,j,k,p,n;
p=1;
while(p==1)
{
printf("Enter n(n=1 to
15):");
scanf("%d",&n);
if(n!=0 && n<=17 &&
n%2!=0)
p=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i--;
j++;
if(i<1 && j>n)
{
i+=2;
j--;
}
else
{
if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else
{
i+=2;
j--;
a[i][j]=k;
}
}
/*输出幻方阵*/
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%3d ",a[i][j]);
printf("\n");
}
system("pause");
}
==================================
第一:奇数幻方利用“楼梯法”和“杨辉法”很简单就能制作出来,可能上面描述的单偶,双偶幻方不是很详细,你可以上网查找一下相关资料,都会有图文解说的,很直观,规律看起来也很简单。
第二:关于编程可以解出幻方,可以进行了解,但是可不能一直只利用它哦,得自己琢磨推算幻方,例如利用推理法也可以把所有的幻方推算出来,这样才能更好地学习(我不用上面的规律也可以把任何一个幻方都推算出来,当然,高次幻方就相对比较难了)。
❹ 3阶幻方的口诀表
居上行正中央,
依次斜填切莫忘,
上出框界往下写,
右出框时左边放,
重复便在下格填,
出角重复一个样。
这玩意直接上网查不就有嘛,而且这种难度的东西记口诀反而比较累吧,额…不过好像小学奥数有?依稀记得四年级还是五年级的?
嘛,总之就是这样(。・ω・。)ノ♡
优质我知道拿不到,也务必不要给我,上网复制了一下什么力都没出不配拿(。ӧ◡ӧ。)
❺ 五阶幻方(要填入的数字是1-25)
18 24 `5 `6 12
10 11 17 23 `4
22 `3 `9 15 16
14 20 21 `2 `8
1` 7` 13 19 25
9 `3 22 16 15
21 20 14 `8 `2
13 `7 `1 25 19
5 `24 18 12 `6
17 11 10 `4 23
17 24 `1 8 15
23 `5 `7 14 16
`4 `6 13 20 22
10 12 19 21 `3
11 18 25 `2 `9
下面这些构造方法都是比较适合于编程的.构造幻方分奇数阶幻方、4n型偶数幻方、4n+2型的偶数幻方(以下简称双偶数、单偶数).
构造奇数阶较简单,常用的是连续摆数法.下面的n均指阶数,在这里(y,x)表示第y横行的第x个数.
(1)在第一行的正中间(即[1,(n+1)/2])放上1 (2)若数a的位置在(y,x),则a+1的位置在:(y-1,x+1),若有这个位子且里面没数 (n,x+1),若y=1且x1 (y+1,x),若x=n且y=1或(y,x)已经有数.(y,x)已经有数的充要条件是a=n(mod n) (3)所构成的(n×n)方即为一个幻方.
我们还可以把连续摆数法推广,先定义几个概念:
普通向量:正常走步的情况.(即上面第一种情况)正常走步记作(b,a).中断向量:即走到(1,n)这个格子或(y,x)已经有数的情况.记作(d,c) 下面是几个推广的情况:(1,-1)(0,1);(1,-1)(0,2);(2,1)(1,-2);(2,1)(1,-1);(2,1)(1,0);(2,1)(1,2)
下面是构造双偶数阶幻方:
对称法:把双偶数型的幻方分成四个正方形,在左上角正方形中每行每列各取一半打上○(实际上就是使无论从每行还是每列来看都刚好有一半有○,一半无○.)然后向剩下的三个小方块中映象(镜像对称),于是整个方阵都布好了○.(用电脑实行则可以选择在该布○的地方填上-1).
接下来该填数了.适用于电脑的方法:向所有格子内填数,(推荐x,y分别从1~n的双重计数循环):若(y,x)没有○,则填入(y-1)*n+x;若(y,x)中有○,则填入(n-y+1)*n+x+1.适用于笔算的方法:从左上角依次1~n*n填数,遇上○则不填,这个数字还是要跳过去.填完后,把方阵旋转180度后再从1~n*n往○里填数,没有○的地方就不填,跳过数字.因为对称的原理,因此这回填的数刚好是上次跳过的数,这次跳过的刚好是上次填过的数.就形成了一个双偶数阶幻方.
下面介绍一下构造单偶数阶幻方的方法——斯特雷奇法
仍然是把单偶数阶幻方分成A、B、C、D四个小方阵,若按平面直角坐标系来看则第一、二、三、四象限分别为A、C、B、D(请一定注意A、B、C、D的位置!)再用连续摆数法将A、B、C、D填入数字,A方阵用1~a^2,B方阵用(a^2+1)~2a^2,C方阵用(2a^2+1)~3a^2,D用数字(3a^2+1~4a^2).其中a=n/2.
这样的方阵还需进行调整.在A的中间一行左侧第2列起取m个方格(这里m=(n-2)/4),即取((n/4+0.5),2)~((n/4+0.5),(2+m))这几个方格,再取A中其它行的左边m个方格.把这些方格中的数字同D中相应方格中的数字对调.然后在C中各列的从右边起的m-1个方格重的数字同B中对调.
这样形成的大方阵就是幻方了.
❻ 幻方的构造原理
在《射雕英雄传》中郭黄二人被裘千仞追到黑龙潭,躲进瑛姑的小屋。瑛姑出了一道题:数字1~9填到三行三列的表格中,要求每行、每列、及两条对角线上的和都相等。这道题难倒了瑛姑十几年,被黄蓉一下子就答出来了。 492357816这就是一个最简单的3阶平面幻方。因为幻方的智力性和趣味性,很多游戏和玩具都与幻方有关,如捉放曹、我们平时玩的六面体,也成为学习编程时的常见问题。
幻方又称纵横图、九宫图,最早记录于中国古代的洛书。夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服。后人称之为洛书或河图,又叫河洛图。
南宋数学家杨辉,在他着的《续古摘奇算法》里介绍了这种方法:只要将九个自然数按照从小到大的递增次序斜排,然后把上、下两数对调,左、右两数也对调;最后再把中部四数各向外面挺出,幻方就出现了。(摘自《趣味数学辞典》)
最简单的幻方就是平面幻方,还有立体幻方、高次幻方等。对于立体幻方、高次幻方世界上很多数学家仍在研究,只讨论平面幻方。
对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)
1、 N 为奇数时,最简单:
⑴ 将1放在第一行中间一列;
⑵ 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1
⑶ 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
⑷ 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
2、 N为4的倍数时
采用对称元素交换法。
首先把数1到n×n按从上至下,从左到右顺序填入矩阵
然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对
称交换,即a(i,j)与a(n+1-i,n+1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)
**以上方法只适合于n=4时**
3、 N 为其它偶数时
当n为非4倍数的偶数(即4n+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。
按上述奇数阶幻方给分解的4个子方阵对应赋值
由小到大依次为上左子阵(i),下右子(i+v),上右子阵(i+2v),下左子阵(i+3v),
即4个子方阵对应元素相差v,其中v=n*n/4
四个子矩阵由小到大排列方式为 ① ③
④ ②
然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2),
a(t-1,0)与a(t+u-1,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换
其中u=n/2,t=(n+2)/4 上述交换使行列及对角线上元素之和相等。
C语言实现 #includestdio.h#includemath.hinta[256][256];intsum;intcheck();voidins(intn);voidmain(){inti,j,n,k,t,p,x;scanf(%d,&n);sum=(n*n+1)*n/2;if(n%2==1)//奇数幻方ins(n);if(n%4==2){//单偶数幻方k=n/2;ins(k);for(i=0;i<k;i++)for(j=0;j<k;j++){a[i][j+k]=a[i][j]+2*k*k;a[i+k][j]=a[i][j]+3*k*k;a[i+k][j+k]=a[i][j]+k*k;}t=(n-2)/4;for(i=0;i<k;i++)for(j=0;j<k;j++){if((j<t)&&(i<t)){p=a[i][j];a[i][j]=a[i+k][j];a[i+k][j]=p;}if((j<t)&&(i>k-t-1)){p=a[i][j];a[i][j]=a[i+k][j];a[i+k][j]=p;}if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){p=a[i][j];a[i][j]=a[i+k][j];a[i+k][j]=p;}if(j>1&&j<=t){p=a[i][j+k];a[i][j+k]=a[i+k][j+k];a[i+k][j+k]=p;}}}if(n%4==0){//双偶数幻方x=1;for(i=0;i<n;i++)for(j=0;j<n;j++)a[i][j]=x++;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i%4==0&&abs(i-j)%4==0)for(k=0;k<4;k++)a[i+k][j+k]=n*n-a[i+k][j+k]+1;elseif(i%4==3&&(i+j)%4==3)for(k=0;k<4;k++)a[i-k][j+k]=n*n-a[i-k][j+k]+1;}}if(check(n)==1){for(i=0;i<n;i++){for(j=0;j<n;j++)printf(%5d,a[i][j]);printf(
);}}}intcheck(intn){//检验是否是幻方inti,j,sum1=0,sum2;for(i=0;i<n;i++){for(j=0;j<n;j++)sum1+=a[i][j];if(sum1!=sum)return0;sum1=0;}for(i=0;i<n;i++){for(j=0;j<n;j++)sum1+=a[i][j];if(sum1!=sum)return0;sum1=0;}for(sum1=0,sum2=0,i=0,j=0;i<n;i++,j++){sum1+=a[i][j];sum2+=a[i][n-j-1];}if(sum1!=sum)return0;if(sum2!=sum)return0;elsereturn1;}voidins(intn){//单偶数幻方的输入intx,y,m;x=0;y=n/2;for(m=1;m<=n*n;m++){a[x][y]=m;if(m%n!=0){x--;y++;if(x<0)x=x+n;if(y==n)y=n-y;}else{x++;if(x==n)x=x-n;}}}//c++语言实现//(1)求奇数幻方#include<iostream.h>#include<iomanip.h>intmain(){intn,x,y,tot=0,i,j,a[100][100]={0};cout<<请输入一个奇数<<endl;cin>>n;a[i=n/2][j=0]=++tot;i--;j--;while(tot<=n*n){i<0?i=n-1:i=i;j<0?j=n-1:j=j;if(a[i][j]){i=x;j=y+1;}a[i][j]=++tot;x=i;y=j;i--;j--;}for(i=0;i<n;i++){for(j=0;j<n;j++)cout<<setw(3)<<a[i][j];cout<<endl;}return0;}//(2)求单偶幻方#include<iostream.h>#include<iomanip.h>intmain(){intn,i=0,j=0,a[100][100],tot=0;cout<<请输入4的倍数<<endl;cin>>n;for(i=0;i<n;i++)for(j=0;j<n;j++){a[i][j]=++tot;}for(i=0;i<n;i++){for(j=0;j<n;j++){if(i%4==j%4||i%4+j%4==3)a[i][j]=n*n+1-a[i][j];}}for(i=0;i<n;i++){for(j=0;j<n;j++){cout<<setw(4)<<a[i][j];}cout<<endl;}return0;}奇阶幻方
当n为奇数时,我们称幻方为奇阶幻方。可以用Merzirac法与loubere法实现,根据我的研究,发现用国际象棋之马步也可构造出更为神奇的奇幻方,故命名为horse法。
偶阶幻方
当n为偶数时,我们称幻方为偶阶幻方。当n可以被4整除时,我们称该偶阶幻方为双偶幻方;当n不可被4整除时,我们称该偶阶幻方为单偶幻方。可用了Hire法、Strachey以及YinMagic将其实现,Strachey为单偶模型,我对双偶(4m阶)进行了重新修改,制作了另一个可行的数学模型,称之为Spring。YinMagic是我于2002年设计的模型,他可以生成任意的偶阶幻方。
在填幻方前我们做如下约定:如填定数字超出幻方格范围,则把幻方看成是可以无限伸展的图形,如下图:
Merzirac法生成奇阶幻方
在第一行居中的方格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向下移一格继续填写。如下图用Merziral法生成的5阶幻方: 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 loubere法生成奇阶幻方
在居中的方格向上一格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向上移二格继续填写。如下图用Louberel法生成的5阶幻方: 23 6 19 2 15 10 18 1 14 22 17 5 13 21 9 4 12 25 8 16 11 24 7 20 3 Hire法生成偶阶幻方
将n阶幻方看作一个矩阵,记为A,其中的第i行j列的数字记为a(i,j)。在A内两对角线上填写1、2、3、……、n,各行再填写1、2、3、……、n,使各行各列数字之和为n*(n+1)/2。填写方法为:第1行从n到1填写,从第2行到第n/2行按从1到进行填写(第2行第1列填n,第2行第n列填1),从第n/2+1到第n行按n到1进行填写,对角线的方格内数字不变。如下所示为6阶填写方法:
1 5 4 3 2 6
6 2 3 4 5 1
1 2 3 4 5 6
6 5 3 4 2 1
6 2 4 3 5 1
1 5 4 3 2 6
如下所示为8阶填写方法(转置以后):
1 8 1 1 8 8 8 1
7 2 2 2 7 7 2 7
6 3 3 3 6 3 6 6
5 4 4 4 4 5 5 5
4 5 5 5 5 4 4 4
3 6 6 6 3 6 3 3
2 7 7 7 2 2 7 2
8 1 8 8 1 1 1 8
将A上所有数字分别按如下算法计算,得到B,其中b(i,j)=n×(a(i,j)-1)。则AT+B为目标幻方
(AT为A的转置矩阵)。如下图用Hire法生成的8阶幻方:
1 63 6 5 60 59 58 8
56 10 11 12 53 54 15 49
41 18 19 20 45 22 47 48
33 26 27 28 29 38 39 40
32 39 38 36 37 27 26 25
24 47 43 45 20 46 18 17
16 50 54 53 12 11 55 9
57 7 62 61 4 3 2 64
⑴.Strachey法生成单偶幻方
将n阶单偶幻方表示为4m+2阶幻方。将其等分为四分,成为如下图所示A、B、C、D四个2m+1阶奇数幻方。
A C
D B
A用1至2m+1填写成(2m+1)2阶幻方;B用(2m+1)2+1至2*(2m+1)2填写成2m+1阶幻方;C用2*(2m+1)2+1至3*(2m+1)2填写成2m+1阶幻方;D用3*(2m+1)2+1至4*(2m+1)2填写成2m+1阶幻方;在A中间一行取m个小格,其中1格为该行居中1小格,另外m-1个小格任意,其他行左侧边缘取m列,将其与D相应方格内交换;B与C接近右侧m-1列相互交换。如下图用Strachey法生成的6阶幻方:
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
⑵Spring法生成以偶幻方
将n阶双偶幻方表示为4m阶幻方。将n阶幻方看作一个矩阵,记为A,其中的第i行j列方格内的数字记为a(i,j)。
先令a(i,j)=(i-1)*n+j,即第一行从左到可分别填写1、2、3、……、n;即第二行从左到可分别填写n+1、n+2、n+3、……、2n;…………之后进行对角交换。对角交换有两种方法:
方法一;将左上区域i+j为偶数的与幻方内以中心点为对称点的右下角对角数字进行交换;将右上区域i+j为奇数的与幻方内以中心点为对称点的左下角对角数字进行交换。(保证不同时为奇或偶即可。)
方法二;将幻方等分成m*m个4阶幻方,将各4阶幻方中对角线上的方格内数字与n阶幻方内以中心点为对称点的对角数字进行交换。
如下图用Spring法生成的4阶幻方:
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
YinMagic构造偶阶幻方
先构造n-2幻方,之后将其中的数字全部加上2n-2,放于n阶幻方中间,再用该方法将边缘数字填写完毕。该方法适用于n>4的所有幻方,我于2002年12月31日构造的数学模型。YinMagic法可生成6阶以上的偶幻方。如下图用YinMagic法生成的6阶幻方:
10 1 34 33 5 28
29 23 22 11 18 8
30 12 17 24 21 7
2 26 19 14 15 35
31 13 16 25 20 6
9 36 3 4 32 27
魔鬼幻方
如将幻方看成是无限伸展的图形,则任何一个相邻的n*n方格内的数字都可以组成一个幻方。则称该幻方为魔鬼幻方。
用我研究的Horse法构造的幻方是魔鬼幻方。如下的幻方更是魔鬼幻方,因为对于任意四个在两行两列上的数字,他们的和都是34。此幻方可用YinMagic方法生成。
15 10 3 6
4 5 16 9
14 11 2 7
1 8 13 12
罗伯法:
1居上行正中央,依次斜填右上方,上出框往下填,
右出框左边放,排重便在下格填,右上排重一个样。
❼ 幻方的程序编写
利用计算机编程序,可求解出任意阶幻方.(但数字位数受电脑限制,实际上只能是有限范围内的任意阶),如利用Matlab进行计算n阶幻方,其命令为:A=magic(n)。
对于某些平方幻方,高次幻方,利用计算机辅助计算,也可快速求得。
一次幻方,一次幻立方,一次多维幻方,甚至可用简单公式全部求得。
某些类型的平方幻方,甚至高次高维幻方,也可用公式求得。
在幻方公式求解方法,中国处于世界领先水平.中国李文的高维高次幻方公式,是幻方理论中的精品.吴硕辛的高次幻方理论,也可用公式求解。
❽ 如何用c语言编程使三阶幻方不等(使用数字1至9,直接输出所有结果
4用1至9这9个数编制一个三阶幻方,写出所有可能的结果。所谓幻方是指在正方形的方格表的每个方格内填入不同的数,使得每行、每列和两条对角线上的各数之和...3119
❾ 如何用c语言编程使三阶幻方不等
这个打印n阶的 0<n<=15是奇数 我在下面帮你改了个3阶的
/* bookp33.c 打印魔方阵程序 */
/* 谭浩强,C程序设计题解与上机指导,33页 */
/* 在tc30下编译通过 */
/* 2001.12.12 */
void main()
{
int a[16][16],i,j,k,p,m,n;
p=1;
while(p==1)
{ printf("请输入n.(0<n<=15,n是奇数.)\n");
scanf("%d",&n);
if((n>=0)&&(n<=15)&&(n%2!=0))
{ printf("矩阵阶数是:%d\n",n);
p=0;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
/* 建立魔方阵 */
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{if(i<1) i=n; if(j>n) j=1; }
if(a[i][j]==0)
a[i][j]=k;
else
{ i=i+2;
j=j-1;
a[i][j]=k;
}
}
/* 输出 */
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
printf(" %3d",a[i][j]);
printf("\n");
}
}
*************3阶的************
int main()
{
int a[16][16],i,j,k,n;
n=3;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
/* 建立魔方阵 */
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{if(i<1) i=n; if(j>n) j=1; }
if(a[i][j]==0)
a[i][j]=k;
else
{ i=i+2;
j=j-1;
a[i][j]=k;
}
}
/* 输出 */
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
printf(" %3d",a[i][j]);
printf("\n");
}
return (1);
}
❿ matab编程实现:幻方矩阵中的1换成什么数该矩阵不可逆
建议楼上的回答问题之前多想一想,不了解的东西尽量不要想当然,以免误人误己。
同一阶的幻方矩阵当然不止一个,但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)))