c++求解神奇阵法求解
神奇阵法(Magic Square)是一个 的矩阵,其中每一行、每一列以及两个对角线上的元素之和相等。求解神奇阵法问题有多种方法,取决于矩阵的大小(n是奇数、偶数或4的倍数)。
以 n 为奇数的情况为例,使用 Siamese 方法
Siamese 方法是最常用的生成奇数阶神奇阵法的方法之一。步骤如下:
- 将1放在第一行的中间。
- 从当前单元格开始,将下一个数字放在右上角的单元格。如果位置超出边界,则从相对边界循环回到矩阵内部。
- 如果所选单元格已经被占用,则放置在当前单元格的正下方。
示例代码
cpp#include <iostream>
#include <vector>
void generateMagicSquare(int n) {
// 创建一个 n x n 的矩阵,初始值为 0
std::vector<std::vector<int>> magicSquare(n, std::vector<int>(n, 0));
// 初始位置
int i = 0;
int j = n / 2;
// 填充矩阵
for (int num = 1; num <= n * n; ++num) {
magicSquare[i][j] = num;
// 计算下一个位置
int nextI = (i - 1 + n) % n;
int nextJ = (j + 1) % n;
if (magicSquare[nextI][nextJ] != 0) {
nextI = (i + 1) % n;
nextJ = j;
}
i = nextI;
j = nextJ;
}
// 输出生成的神奇阵法
for (const auto &row : magicSquare) {
for (int val : row) {
std::cout << val << "\t";
}
std::cout << std::endl;
}
}
int main() {
int n;
std::cout << "请输入一个奇数:";
std::cin >> n;
if (n % 2 == 0) {
std::cout << "请输入一个奇数。" << std::endl;
return 1;
}
generateMagicSquare(n);
return 0;
}
代码说明
- 创建矩阵:使用
std::vector
创建一个 n x n 的二维矩阵,并初始化为 0。 - 初始位置:将第一个数字1放在第一行的中间位置。
- 填充矩阵:依次填入从1到 的数字。每次填入后,计算下一个位置:
- 如果新位置已经被占用,则将数字放置在当前单元格的正下方。
- 否则,继续将数字放置在右上角的新位置。
- 输出矩阵:最终输出生成的神奇阵法。
通过这种方法,您可以生成一个奇数阶的神奇阵法。如果需要生成偶数阶(尤其是4的倍数)或其他类型的神奇阵法,需要使用不同的算法。