幻方是一个 n × n 的矩阵,由 1 到 n^2 的连续整数填充,使得所有行、列和对角线上的元素之和相等。对于四阶幻方,我们需要找出所有组合满足这个条件。
以下是一个用 C++ 编写的程序,可以打印出所有的四阶幻方,并统计幻方的数量:
#include <iostream>
using namespace std;
int countMagicSquares = 0; // 幻方数目计数器
// 检查一个 4 x 4 矩阵是否为幻方
bool isMagicSquare(int square[4][4]) {
int sum = 0; // 行、列、对角线之和
// 检查每一行的和
for (int i = 0; i < 4; i++) {
int rowSum = 0;
for (int j = 0; j < 4; j++) {
rowSum += square[i][j];
}
if (i == 0) {
sum = rowSum; // 初始化行和
} else if (rowSum != sum) {
return false; // 不相等则不是幻方
}
}
// 检查每一列的和
for (int i = 0; i < 4; i++) {
int colSum = 0;
for (int j = 0; j < 4; j++) {
colSum += square[j][i];
}
if (colSum != sum) {
return false; // 不相等则不是幻方
}
}
// 检查主对角线的和
int diagonalSum = 0;
for (int i = 0; i < 4; i++) {
diagonalSum += square[i][i];
}
if (diagonalSum != sum) {
return false; // 不相等则不是幻方
}
// 检查副对角线的和
int antiDiagonalSum = 0;
for (int i = 0; i < 4; i++) {
antiDiagonalSum += square[i][3 - i];
}
if (antiDiagonalSum != sum) {
return false; // 不相等则不是幻方
}
return true;
}
// 输出幻方
void printMagicSquare(int square[4][4]) {
cout << "Magic Square #" << countMagicSquares + 1 << ":" << endl;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
cout << square[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
// 生成所有可能的四位幻方
void generateMagicSquares(int square[4][4], int numUsed, int i, int j) {
// Base Case: 所有位置都已填满
if (numUsed == 16) {
// 检查该矩阵是否为幻方
if (isMagicSquare(square)) {
countMagicSquares++; // 统计幻方数量
printMagicSquare(square); // 输出幻方
}
return;
}
// 在剩余未使用的数字中选择一个填入当前位置
for (int k = 1; k <= 16; k++) {
bool alreadyUsed = false;
// 检查数字是否已经被使用
for (int m = 0; m < 4; m++) {
for (int n = 0; n < 4; n++) {
if (square[m][n] == k) {
alreadyUsed = true;
break;
}
}
if (alreadyUsed) {
break;
}
}
// 如果数字未被使用,则填入当前位置
if (!alreadyUsed) {
square[i][j] = k;
// 移动到下一个位置
int nextI = i + (j + 1) / 4;
int nextJ = (j + 1) % 4;
// 递归调用生成下一个位置的幻方
generateMagicSquares(square, numUsed + 1, nextI, nextJ);
// 回溯,将当前位置重新标记为未使用状态
square[i][j] = 0;
}
}
}
int main() {
int square[4][4] = {0}; // 初始化矩阵全为0
generateMagicSquares(square, 0, 0, 0); // 从第一个位置开始生成幻方
cout << "Total Magic Squares: " << countMagicSquares << endl;
return 0;
}
这个程序使用回溯法来生成所有可能的四阶幻方,并且通过调用 `isMagicSquare` 函数来检查每个矩阵是否和幻方匹配。如果某个矩阵是幻方,则通过调用 `printMagicSquare` 函数来打印幻方的内容。最后,程序会输出幻方的数量。
希望这个程序能帮到你!如果有任何问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |