分享
 
 
 

关于魔方阵的解法

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

首先把从1~n2的整数按从小到大的顺序排列成一个n×n的方阵A进行观察。(本文中所有n都是指大于1的奇数,下文中均以“A”代表这类顺序排列的n×n方阵)

以5阶阵为例:以下是A方阵

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

下边是魔方阵B:

12 16 25 4 8

6 15 19 23 2

5 9 13 17 21

24 3 7 11 20

18 22 1 10 14

先假设n阶奇次魔方阵B是存在的,从A中可以看出,B的任一元素在A中都有唯一确定的行号和列号组合(y,x)。

分离出B中所有元素在A中的行号y来构成n×n方阵I,让I(i,j)等于从B(i,j)分离出来的y;(如I(1,1) =3,即12在A中的行号A(3,2);I(1,2)=4,即16在A中的行号A(4,1)。)以下是I方阵:

3 4 5 1 2

2 3 4 5 1

1 2 3 4 5

5 1 2 3 4

4 5 1 2 3

同样分离出B中所有元素在A中的列号y来构成n×n方阵J,让J(i,j)等于从B(i,j)分离出来的x。以下是J方阵

2 1 5 4 3

1 5 4 3 2

5 4 3 2 1

4 3 2 1 5

3 2 1 5 4

观察方阵I特征为:

1.组成方阵的数为1~n的整数;

2.任一行、列均遍历1~n的所有整数;

3.主对角线上的数均为(n+1)/2,辅对角线遍历1~n的所有整数。

方阵J特征前两点同I,区别是第三点,辅对角线上的数均为(n+1)/2,主对角线遍历1~n的所有整数。 另外还有轻易忽略的一点,I、J方阵对应位置上的数字组合[I(i,j),J(i,j)]是唯一的。

综合以上的结论可以知道:B(i,j)=(I(i,j)-1)×n+J(i,j)。所以只要构造出这样两个只含1~n的数的方阵I和J,就可以确定一个n×n的魔方阵。

现在,问题就转化为怎样构造分别满足I和J的特征的两个n×n方阵。其实完成这样的算法是很简单的,可以按以下方法实现:

1)方阵I的第一行由(n+1)/2打头,后面依次为前一个数关于n的循环后继;

2)方阵I的第i+1行由第i行循环右移得到。

本人给出的程序:

main()

{

int n,i,j;

int a[20][20],x[20][20],y[20][20];/* a数组为最后结果数组文中的B方阵,X,Y分别是文中提到的数组I,J*/

printf("please input the number:");

scanf("%d",&n); /*输入需要的数组维数*/

x[0][0]=(n+1)/2;

for(j=1;j<n;j++)

{

if(x[0][j-1]==n) x[0][j]=x[0][j-1]+1-n;

else x[0][j]=x[0][j-1]+1;

}/*给x中的第一行元素赋值*/

for(i=1;i<n;i++)

for(j=0;j<n;j++)

{

if(j-1<0) x[i][j]=x[i-1][j-1+n];

else x[i][j]=x[i-1][j-1];

} /*通过变换给X的所有元素赋值*/

clrscr();

printf("X:\n");

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{

printf("%3d",x[i][j]);

if(j==n-1)printf("\n");

}/*输出X数组*/

for(i=0;i<n;i++)

for(j=0;j<n;j++)

y[i][j]=x[i][n-1-j];/*通过文中提到的公式给Y数组赋值*/

printf("Y:\n");

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{printf("%3d",y[i][j]);

if(j==n-1)printf("\n");

}/*输出Y数组*/

for(i=0;i<n;i++)

for(j=0;j<n;j++)

a[i][j]=(x[i][j]-1)*n+y[i][j];

printf("A:\n");

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{printf("%5d",a[i][j]);

if(j==n-1)printf("\n");}

/*输出A数组结果*/

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有