构造n阶魔方阵
何谓魔方阵?
4 9 2
3 5 7
8 1 6
定义:由n*n个数字所组成的n阶方阵,具有各对角线,各横列与纵行的数字和都相等的性质,称为魔方阵。而这个相等的和称为魔术数字。若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。
1.
(1)
(2)
(3)
(4)
根据此规则填充的3阶魔方阵如下:
|
8 |
1 |
6 |
|
3 |
5 |
7 |
|
4 |
9 |
2 |
2.
(1)
(2)
(3)
(2)后:
3.
本法填制魔方阵时,先将整个方阵划成田字型的四个2 k + 1阶的奇数阶小方阵,并以下法做注记:
1,右半两个小方阵中大于k+2的行。
2,左半两个小方阵中( k + 1 , k + 1 )的格位。
3,左半两个小方阵中除了( 1 , k + 1 )的格位之外,小于k +1的行。
以1的方法连续填制法依左上、右下、右上、左下的顺序分别填制这四个小方阵。
将上半及下半方阵中有注记的数字对调,魔方阵完成。
代码如下,n1 n2 n3分别表示上述三种情况对应的构造函数。
- #include
- #define
N 520 -
- int
num[N][N]; -
- void
n1( intn) - {
-
inti,j,count=0; -
for(i=0,j=(n-1)/2;count<> -
{ -
count++; -
num[i][j]=count; -
if(count%n==0) -
{ -
i++; -
} -
else -
{ -
i--; -
j++; -
} -
if(i<0) -
i+=n; -
if(j>=n) -
j-=n; -
} -
for(i=0;i<> -
{ -
for(j=0;j<> -
{ -
"%dprintf( " ,num[i][j]); -
} -
"%d\n",num[i][n-1]);printf( -
} - }
-
- void
n2( intn) - {
-
inti,j,k,t; -
for(i=1;i<=n;i+=4) -
for(j=1;j<=n;j+=4) -
{ -
for(k=0;k<4;k++) -
{ -
num[i+k][j+k] = 1; -
num[i+k][j+3-k] = 1; -
} -
} -
t = 0; -
for(i=1;i<=n;i++) -
for(j=1;j<=n;j++) -
{ -
t++; -
if(num[i][j])num[i][j] = t; -
} -
t = 0; -
for(i=n;i>=1;i--) -
for(j=n;j>=1;j--) -
{ -
t++; -
if(num[i][j]==0)num[i][j] = t; -
} -
-
for(i=1;i<=n;i++) -
{ -
for(j=1;j<> -
{ -
"%dprintf( " ,num[i][j]); -
} -
"%d\n",num[i][n]);printf( -
} - }
-
- void
n3( intn) - {
-
inti,j,m,t,v,count=0; -
v=(n+2)/4; -
m=n/2; -
for(i=0,j=(m-1)/2;count<> -
{ -
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<> -
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<> -
i+=m; -
if(j>=m) -
j-=m; -
} -
for(i=0;i<> -
{ -
for(j=0;jn-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<> -
{ -
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; -
for(i=0;i<> -
{ -
for(j=0;j<> -
{ -
"%dprintf( " ,num[i][j]); -
} -
"%d\n",num[i][n-1]);printf( -
} - }
-
- int
main() - {
-
intn; -
"%d",&n);scanf( -
if((n%2)!=0) -
n1(n); -
elseif((n%4)==0) -
n2(n); -
else -
n3(n); -
return0; - }

评论