求大佬帮忙解答一道题目
输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为8 1 6
3 5 7
4 9 2
要求输出1~n2 的自然数构成的魔方阵。
(说明:1. 魔方阵的阶数为奇数阶。
2.1放在第1行的中间。
3. 从2 开始直到n*n,各数按此规则存放:每一个数存放的行比前一个数的行数减1,列数加1 。
4. 如果上一个数的行数为1,则下一个数的行数为n,列数加1。
5. 如果上一个数的列数为n,则下一个数的列数为1,行数减1。
6. 如果确定位置上已有数或则上一个数是第1行第n列时,则把下一个数放在上一个数的下面。) #include <stdio.h>
#include <stdlib.h>
void mf(int n)
{
int a , b , i , j , k , ** p ;
if(n > 2 && n % 2) {
p = (int **) malloc(sizeof(int *) * n) ;
for(i = 0 ; i < n ; i ++) p = (int *) malloc(sizeof(int) * n) ;
for(i = 0 ; i < n ; i ++) {
for(j = 0 ; j < n ; j ++) {
p = 0 ;
}
}
for(a = i = 0 , b = n / 2 ; i < n * n ; i ++) {
p = i + 1 ;
if(! a && b == n - 1) {
a ++ ;
} else {
if(! a) a = n - 1 ;
else a -- ;
if(b == n - 1) b = 0 ;
else b ++ ;
if(p) {
a += 2 ;
b -- ;
}
}
}
printf("n = %d\n" , n) ;
for(i = 0 ; i < n ; i ++) {
printf("%5d" , p) ;
for(j = 1 ; j < n ; j ++) printf(" %5d" , p) ;
printf("\n") ;
}
printf("\n") ;
for(i = 0 ; i < n ; i ++) free(p) ;
free(p) ;
}
}
int main(void)
{
int i ;
for(i = 3 ; i < 10 ; i += 2) mf(i) ;
}
编译、运行实况
D:\0002.Exercise\C>g++ -o mfx mfx.c
D:\0002.Exercise\C>mfx
n = 3
8 1 6
3 5 7
4 9 2
n = 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
n = 7
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
n = 9
47 58 69 80 1 12 23 34 45
57 68 79 9 11 22 33 44 46
67 78 8 10 21 32 43 54 56
77 7 18 20 31 42 53 55 66
6 17 19 30 41 52 63 65 76
16 27 29 40 51 62 64 75 5
26 28 39 50 61 72 74 4 15
36 38 49 60 71 73 3 14 25
37 48 59 70 81 2 13 24 35
D:\0002.Exercise\C> jackz007 发表于 2021-3-19 14:38
编译、运行实况
谢谢谢谢
页:
[1]