|
发表于 2024-4-15 19:38:56
|
显示全部楼层
抱歉,我在之前的回答中没有正确解决这两行代码的问题。对于计算行和、列和和对角线和的逻辑,你需要使用正确的数组下标操作,而不是简单地重复相加同一个元素。
以下是修改后的代码:
- #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;
- }
- }
- int main() {
- // 生成幻方的所有可能性
- vector<int> nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
- do {
- vector<vector<int>> square = {
- { nums[0], nums[1], nums[2], nums[3] },
- { nums[4], nums[5], nums[6], nums[7] },
- { nums[8], nums[9], nums[10], nums[11] },
- { nums[12], nums[13], nums[14], nums[15] }
- };
- if (isMagicSquare(square)) {
- magicSquares.push_back(square);
- }
- } while (next_permutation(nums.begin(), nums.end()));
- // 输出所有符合条件的幻方
- for (int i = 0; i < magicSquares.size(); i++) {
- cout << "Magic Square #" << i + 1 << ":" << endl;
- printSquare(magicSquares[i]);
- cout << endl;
- }
- return 0;
- }
复制代码
这个程序使用了`next_permutation`函数来生成所有的幻方可能性,并判断它们是否为幻方。然后通过`printSquare`函数输出所有符合条件的幻方。请注意,在输出幻方时,我添加了一些格式化的空行,以提高可读性。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|