构造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) - {
-
i,j,count=0; -
-
{ -
count++; -
num[i][j]=count; -
-
{ -
i++; -
} -
-
{ -
i--; -
j++; -
} -
-
i+=n; -
-
j-=n; -
} -
-
{ -
-
{ -
printf( " ,num[i][j]); -
} -
printf( -
} - }
-
- void
n2( intn) - {
-
i,j,k,t; -
-
-
{ -
-
{ -
num[i+k][j+k] = 1; -
num[i+k][j+3-k] = 1; -
} -
} -
t = 0; -
-
-
{ -
t++; -
num[i][j] = t; -
} -
t = 0; -
-
-
{ -
t++; -
num[i][j] = t; -
} -
-
-
{ -
-
{ -
printf( " ,num[i][j]); -
} -
printf( -
} - }
-
- void
n3( intn) - {
-
i,j,m,t,v,count=0; -
v=(n+2)/4; -
m=n/2; -
-
{ -
count++; -
num[i][j]=count; -
-
i++; -
-
{ -
i--; -
j++; -
} -
-
i+=m; -
-
j-=m; -
} -
-
{ -
count++; -
num[i][j]=count; -
-
i++; -
-
{ -
i--; -
j++; -
} -
-
i+=m; -
-
j-=m; -
} -
-
{ -
count++; -
num[i][j]=count; -
-
i++; -
-
{ -
i--; -
j++; -
} -
-
i+=m; -
-
j-=m; -
} -
-
{ -
count++; -
num[i][j]=count; -
-
i++; -
-
{ -
i--; -
j++; -
} -
-
i+=m; -
-
j-=m; -
} -
-
{ -
-
{ -
t=num[i][j]; -
num[i][j]=num[i+m][j]; -
num[i+m][j]=t; -
} -
-
{ -
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; -
-
{ -
-
{ -
printf( " ,num[i][j]); -
} -
printf( -
} - }
-
- int
main() - {
-
n; -
scanf( -
-
n1(n); -
if((n%4)==0) -
n2(n); -
-
n3(n); -
0; - }
评论