魔方阵

魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线上的累加和都相等。

  • 输入魔方阵的行数m,要求m为奇数,程序对所有输入的m作简单的判断,如m有错,能给出适当的提示信息
  • 实现魔方阵
  • 输出魔方阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 输出魔方阵
void printMagicSquare(int m, int** magicSquare) {
printf("魔方阵行数 m = %d:\n", m);
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
printf("%2d ", magicSquare[i][j]);
}
printf("\n");
}
}

// 构建魔方阵
void generateMagicSquare(int m) {
if (m % 2 == 0) {
printf("错误: m 必须是奇数。\n");
return;
}

// 动态分配内存来存储魔方阵
int** magicSquare = (int**)malloc(m * sizeof(int*));
for (int i = 0; i < m; i++) {
magicSquare[i] = (int*)malloc(m * sizeof(int));
}

// 初始化魔方阵的所有元素为 0
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
magicSquare[i][j] = 0;
}
}

int num = 1;
int row = 0;
int col = m / 2;

while (num <= m * m) {
magicSquare[row][col] = num;
num++;

// 计算下一个位置
int nextRow = (row - 1 + m) % m;
int nextCol = (col + 1) % m;

// 如果下一个位置已经被占据,则向下移动一行
if (magicSquare[nextRow][nextCol] != 0) {
row = (row + 1) % m;
} else {
row = nextRow;
col = nextCol;
}
}

printMagicSquare(m, magicSquare);

// 释放动态分配的内存
for (int i = 0; i < m; i++) {
free(magicSquare[i]);
}
free(magicSquare);
}

int main() {
int m;

printf("输入魔方阵的行数/列数必须为奇数: ");
scanf_s("%d", &m);

// 检查输入是否为奇数
if (m % 2 == 0) {
printf("错误: 行数/列数必须为奇数。\n");
} else {
generateMagicSquare(m);
}

return 0;
}

1
2
3
4
5
6
7
输入魔方阵的行数/列数必须为奇数: 5
魔方阵行数 m = 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