幻方的构造原理

如题所述

在《射雕英雄传》中郭黄二人被裘千仞追到黑龙潭,躲进瑛姑的小屋。瑛姑出了一道题:数字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.hint a[256][256];int sum;int check();void ins(int n);void main(){  int i,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;        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[i][j]);      printf(\n);    }  }}int check(int n) { //检验是否是幻方  int i,j,sum1=0,sum2;  for(i=0; i<n; i++){    for(j=0; j<n; j++)      sum1+=a[i][j];    if(sum1!=sum)      return 0;    sum1=0;  }  for(i=0; i<n; i++){    for(j=0; j<n; j++)      sum1+=a[i][j];    if(sum1!=sum)      return 0;    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)    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++语言实现//(1)求奇数幻方#include<iostream.h>#include<iomanip.h>int main(){  int n,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;  }  return 0;}//(2)求单偶幻方#include<iostream.h>#include<iomanip.h>int main(){  int n,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;  }  return 0;}奇阶幻方
当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居上行正中央,依次斜填右上方,上出框往下填,
右出框左边放,排重便在下格填,右上排重一个样。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-04-13
乘幻方 ▪ 高次幻方 ▪ 反幻方 ▪ 三阶幻方 2 起源记载 3 历史发展 4 纪录 5 幻方欣赏 6 构造原理 7
相似回答