<>转:</P>
<>解:魔方阵中各数的排列规律如下:</P>
<>(1)将1放在第一行中间一列;</P>
<P>(2)从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);</P>
<P>(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如1在第1行,则2应放在最下一行,列数同样加1;</P>
<P>(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如2在第3行最后一列,则3应放在第2行第1列;</P>
<P>(5)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。按此方法可以得到任何阶的魔方阵。#include <stdio.h></P>
<P>main()</P>
<P>{ int a[16][16],i,i,k,p,m,n;</P>
<P> p=1;</P>
<P> while(p==1) /*要求阶数为1~15的商数*/</P>
<P> { printf("Enter n(n=1~15):");</P>
<P> scanf("%d",&n);</P>
<P> if((n!=0)&&(n<=15)&&(n%2!=0)) p=0;</P>
<P> }</P>
<P> for(i=1;i<=n;i++) /*初始化*/</P>
<P> for(j=1;j<=n;j++) a[j]=0;</P>
<P> j=n/2+1; /*建立魔方阵*/</P>
<P> a[1][j]=1;</P>
<P> for(k=2;k<=n*n;k++)</P>
<P> { i=i-1;</P>
<P> j=j+1;</P>
<P> if((i<1)&&(j>n))</P>
<P> { i=i+2;</P>
<P> j=j-1;</P>
<P> }</P>
<P> else</P>
<P> { if(i<1) i=n;</P>
<P> if(j>n) j=1;</P>
<P> }</P>
<P> if(a[j]==0) a[j]=k;</P>
<P> else</P>
<P> { i=i+2;</P>
<P> j=j-1;</P>
<P> a[j]=k;</P>
<P> }</P>
<P> }</P>
<P> for(i=1;i<=n;i++) /*输出魔方阵*/</P>
<P> { for(j=1;j<=n;j++)</P>
<P> printf("%4d",a[j]);</P>
<P> printf("\n");</P>
<P> }</P>
<P>}</P>
<P>运行结果:</P>
<P>Enter n(n=1~15):5↙</P>
<P> 17 24 1 8 15</P>
<P> 23 5 7 14 16</P>
<P> 4 6 13 20 22</P>
<P> 10 12 19 21 3</P>
<P> 11 16 25 2 9</P>
<P>说明,魔方阵的阶数应为奇数,程序指定其最大值为15。今定义数组a为16行16列,第0行第0列不用来放数据,只用第1~15行,以符合人们的习惯。</P>
|