|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <iostream>
#include <vector>
using namespace std;
// 判断当前矩阵是否为幻方
bool isMagicSquare(vector<vector<int>>& square){
int sum = square + square + square + square; // 计算第一行的和
// 检查每行的和
for (int i = 1; i < 4; i++) {
int rowSum = square[i] + square[i] + square[i] + square[i][3];
if (rowSum != sum) {
return false;
}
}
// 检查每列的和
for (int j = 0; j < 4; j++) {
int colSum = square[j] + square[j] + square[j] + square[j];
if (colSum != sum) {
return false;
}
}
// 检查对角线的和
int diagSum1 = square + square + square + square[3];
int diagSum2 = square + square + square[2] + square;
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;
}
cout << endl;
}
// 生成所有的四阶幻方
void generateMagicSquares(vector<vector<int>>& square, vector<bool>& used, int num, int& count) {
if (num > 16) {
if (isMagicSquare(square)) {
count++;
printSquare(square);
}
return;
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (!used[num]) {
square[j] = num;
used[num] = true;
generateMagicSquares(square, used, num + 1, count);
used[num] = false;
}
}
}
}
int main() {
vector<vector<int>> square(4, vector<int>(4));
vector<bool> used(17, false); // 记录数字是否已经被使用过
int count = 0;
generateMagicSquares(square, used, 1, count);
cout << "总共有 " << count << " 个四阶幻方。" << endl;
return 0;
}[/i][/i][/i][/i][/i]
以下是完整的代码:
- #include <iostream>
- #include <vector>
- using namespace std;
- vector<vector<int>> magicSquares; // 存储所有幻方的全局变量
- // 判断当前矩阵是否为幻方
- bool isMagicSquare(const 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(const vector<vector<int>>& square) {
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- cout << square[i][j] << " ";
- }
- cout << endl;
- }
- }
- // 生成所有可能的4x4幻方
- void generateMagicSquares() {
- vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
-
- do {
- vector<vector<int>> square;
- for (int i = 0; i < 4; i++) {
- vector<int> row;
- for (int j = 0; j < 4; j++) {
- row.push_back(nums[i * 4 + j]);
- }
- square.push_back(row);
- }
-
- if (isMagicSquare(square)) {
- magicSquares.push_back(square);
- }
- } while (next_permutation(nums.begin(), nums.end()));
- }
- int main() {
- generateMagicSquares();
-
- cout << "共有 " << magicSquares.size() << " 个4x4幻方:" << endl;
- for (const auto& square : magicSquares) {
- printSquare(square);
- cout << endl;
- }
-
- return 0;
- }
复制代码
这段代码通过生成所有可能的4x4矩阵,并判断每个矩阵是否为幻方,最后输出所有的幻方。请注意,生成所有可能的矩阵是一个非常耗时的操作,因此程序可能需要较长时间来运行。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|