抱歉,前面的回答中出现了一些错误。修正后的代码如下:
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> magicSquares; // 存储所有幻方的全局变量
// 判断当前矩阵是否为幻方
bool isMagicSquare(vector<vector<int>>& square) {
int sum = square[0][0] + square[0][1] + square[0][2] + square[0][3]; // 计算第一行的和
// 检查每行的和
for (int i = 1; i < 4; i++) {
int rowSum = square[i][0] + square[i][1] + square[i][2] + square[i][3];
if (rowSum != sum) {
return false;
}
}
// 检查每列的和
for (int j = 0; j < 4; j++) {
int colSum = square[0][j] + square[1][j] + square[2][j] + square[3][j];
if (colSum != sum) {
return false;
}
}
// 检查对角线的和
int diagSum1 = square[0][0] + square[1][1] + square[2][2] + square[3][3];
int diagSum2 = square[0][3] + square[1][2] + square[2][1] + square[3][0];
if (diagSum1 != sum || diagSum2 != sum) {
return false;
}
return true;
}
// 输出矩阵
void printSquare(vector<vector<int>>& square) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
cout << square[i][j] << " ";
}
cout << endl;
}
}
// 递归生成幻方
void generateMagicSquare(vector<vector<int>>& square, int n, int row, int col, vector<bool>& used) {
if (row == n) {
if (isMagicSquare(square)) {
magicSquares.push_back(square);
}
return;
}
if (col == n) {
generateMagicSquare(square, n, row + 1, 0, used);
return;
}
for (int num = 1; num <= 16; num++) {
if (!used[num - 1]) {
square[row][col] = num;
used[num - 1] = true;
generateMagicSquare(square, n, row, col + 1, used);
square[row][col] = 0;
used[num - 1] = false;
}
}
}
int main() {
vector<vector<int>> square(4, vector<int>(4, 0)); // 初始化矩阵
vector<bool> used(16, false); // 记录数字是否被使用过
generateMagicSquare(square, 4, 0, 0, used);
for (auto& s : magicSquares) {
printSquare(s);
cout << endl;
}
return 0;
}
这段代码使用了递归的方法来生成所有可能的幻方,并通过判断函数`isMagicSquare`确认是否为幻方。最后输出所有的幻方矩阵。注意,这里使用了二维向量`vector<vector<int>>`来表示矩阵。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |