最终确定魔术方形生成器

Finalize the magic square generator

本文关键字:方形生 魔术      更新时间:2023-10-16

此仅针对奇数N运行的代码。问题是没有想法如何添加对偶数n

的支持
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    setlocale(0, "");
    int n;
    cout << "Enter the size of the magic square - ";
    cin >> n;
    int **matrix = new int *[n];
    for (int i = 0; i < n; ++i)
    {
        matrix[i] = new int[n];
    }
    int nsqr = n * n;
    int i = 0, j = n / 2;
    for (int k = 1; k <= nsqr; ++k)
    {
        matrix[i][j] = k;
        i--;
        j++;
        if (k % n == 0)
        {
            i += 2;
            --j;
        }
        else
        {
            if (j == n)
            {
                j -= n;
            }
            else if (i < 0)
            {
                i += n;
            }
        }
    }
    cout << "nnMagic square size - " << n << "nn";
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << matrix[i][j] << "t";
        }
        cout << endl;
    }
    for (i = 0; i < n; i++)
        delete[] matrix[i];
    delete[] matrix;
    system("pause >> null");
    return 0;
}

我将感谢有关故障排除的提示。

如果我没记错的话,问题在此行中:

int i = 0, j = n / 2;

,但我不知道如何更改代码以支持偶数

我会假设您的意思是 normal 魔术方形(其中数字仅限于1,2..n^2)

首先,为n = 2构建这样的魔法正方形是不大的。

第二,您将需要一种全新的算法,这要复杂得多。本文解决了问题(为构建魔术平方>偶数偶数),尽管那里没有任何PSAUDO代码,但解释中的实现非常简单(虽然很长)。

问题在这里:

i = 0;
int j = n / 2;
for (int k = 1; k <= nsqr; ++k)
{
    matrix[i][j] = k;
    i--;
}

看看您如何在循环内部减小我,并将其作为数组的索引,因此:

 matrix[-3][j] = k; // will be in your code

您故意用数组的索引搞乱

我在这个artcile中找到了我的问题的答案我根据本文进行了完整的修订算法。后来发布的列出了结果程序