输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如: 8 1 6 3 5 7 4 9 2 要求输出1~n^2的自然数构成的魔方阵。
void func(int n) { /* 输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如: 8 1 6 3 5 7 4 9 2 要求输出1~n^2的自然数构成的魔方阵。 */ if (n % 2 == 1) { // 奇数阶魔方阵 int* arr = (int*)malloc(sizeof(int) * n * n); memset(arr, 0, sizeof(int) * n * n); int x=0, y=n/2, x_prev=x, y_prev=y; for (int i = 1; i <= n*n; i++) { *(arr + x * n + y) = i;//arr[x][y] = i; if (i == n * n)break; //更新x y x_prev = x; y_prev = y; x = (x - 1 + n) % n; //+n取模防止越界 y = (y + 1 + n) % n; if (*(arr + x * n + y) != 0) { x = (x_prev + 1 +n )% n; y = y_prev; // 被占据 移动到x_p,y_p正下方 printf("轮数:%d 当前位置(%d, %d)-> %d\n正下方元素:%d\n", i,x,y,*(arr + x * n + y) ,*(arr + (x_prev + 1) * n + y_prev)); } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%4d ", *(arr + i * n + j)); } printf("\n"); } } if (n % 2 == 0) { printf("应当分成4n和6n+-2操作。太过复杂,不做!"); } return ; }
。
【答案解析】
| 17 | ...
用户登录可进行刷题及查看答案
| 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 | 仔细观察上述矩阵,可以看到以下规律:
魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n^2-1个数依次按下列规则存放:
将1放在第1行的中间一列。 从2开始直到n*n止,各数依次按此规律存放:每一个数存放的行比前一个数的行数减1,列数加1。 如果上一行的行数为1,则下一个数的行数为n(指最下一行)。 当上一个数的列数为n时,下一个数的列数应该为1。 如果按上面规律确定的位置有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
#include <stdio.h> int main() { int a[15][15], n, i, j, k; while (1) { printf("请输入n(1~15):"); scanf("%d", &n); if (n != 0 && n <= 15 && n % 2 != 0) break; else { printf("请输入奇数\n"); } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) a[i][j] = 0; } j = n / 2 + 1; a[1][j] = 1; i = 1; for (k = 2; k <= n*n; k++) { i -= 1; j += 1; if (i<1 && j>n) { i += 2; j -= 1; } else if (i<1) { i = n; } else if (j>n) { j = 1; } if (a[i][j] == 0) { a[i][j] = k; } else { i += 2; j -= 1; a[i][j] = k; } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) printf("%5d", a[i][j]); printf("\n"); } return 0; }
登录后提交答案