c++ - Generating 'Magic Square' Algorithm(算法来自一本书)

标签 c++

这个幻方代码的问题我已经有一段时间了。我一直在逐步遵循一本书的算法,但由于某些原因,它无法正确显示。

int main(){
    int n;
    char temp[100];
    cout << "Enter an odd number: ";
    cin >> temp;
    n = atoi(temp);
    cout << endl;
    //error if its even
    if (n%2 == 0){
        cout << "Input Error!";
        return (-1);
        cout << endl;
    }

    int square[n][n];
    //places 0 inside
    for (int r = 0; r < n; r++){
        for (int c = 0; c < n; c++){
            square[r][c] = 0;
        }
    }
    //store 1 in middle of first row
    square[0][(n-1)/2] = 1;
    //current position
    int key = 2, i = 0, j = (n-1)/2;

    while(key <= n*n){
        int k = (i-1)%n, l = (j-1)%n; //look up and left
        //square occupied, move down
        if (square[k][l] != 0){
            i = (i+1)%n;
        }
        //square (k,l) needs to be assigned
        else{
            i = k;
            j = l;
        }
        square[i][j] = key; //assign it a value
        key++;
    }

    //display
    for (int r = 0; r < n; r++){
        for (int c = 0; c < n; c++){
            cout << setw(5) << square[r][c] << setw(5);
        }
        cout << endl;
    }

    return 0;
}

如果我输入 5 作为奇数,显示会是这样的:

Enter an odd number: 5

    5   14   22   20   18
    6   15   23    0   19
   17   16   24    0    0
    0    0   25    0    0
    0    0    0    0    0

我期望的输出是:

Enter an odd number: 5

   15    8    1   24   17
   16   14    7    5   23
   22   20   13    6    4
    3   21   19   12   10
    9    2   25   18   11

似乎是什么问题?

最佳答案

我运行了你的代码,结果如下

Enter an odd number: 5

5    3    1   10   23
6    4    2   11   24
7   16   14   12   25
18   17   15   13   21
19    0    0    0    0

我想这是编译器之间的一些差异。您的问题可能是负数的模也是负数:link

用负值索引是未定义的行为:link

关于c++ - Generating 'Magic Square' Algorithm(算法来自一本书),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772687/

相关文章:

从 Excel 2010 中的 VBA 调用的 C++ DLL 仅适用于管理员模式

c++ - 在 C++ 中使用 Armadillo 库将条目分配到稀疏矩阵的任何更快的方法

c++ - 使用一次时,显示列表是否比即时模式更好?

c++ - 如何将 reinterpret_cast<WPARAM>(reinterpret_cast<LPCREATESTRUCT>(lParam)->hwndParent) 转换为 VB6?

c++ - 如何获得 QHBoxLayout 固定高度?

C++ 一行测试 CIN

c++ - 来自 math.h 的 C/C++ log10 函数产生不正确的值

c++ - MS Visual Studio 2008 上的 stdlib.h 的 random()

c++ - 调整 "std::vector"的大小;哪些元素受到影响?

c++ MPI广播 vector