首页 > 解决方案 > 我的构造奇数幻方的代码不起作用

问题描述

我正在尝试通过连体方法构造奇数幻方

这是我的代码

#include <iostream>
#include <cstring>
using namespace std;

int main(){
    int N; cin >> N;
    int magicsquares[N][N];
    memset(magicsquares, 0, sizeof(magicsquares));

    int i = 0, j = N/2;
    int num = 1;
    while (num <= N*N){

        if (magicsquares[i][j] == 0){
            magicsquares[i][j] = num++;
            i = (i-1+N) % N;    
            j = (j+1) % N;
        } else{
            i = (i+2) % N;
            j = (j-1+N) % N;
            magicsquares[i][j] = num++;
        } 
    }

    for (int a = 0; a < N; a++){
        for (int b = 0; b < N; b++)
            cout << magicsquares[a][b] << " ";
        cout << endl;
    }
    return 0;
}

当我输入 3 时,我预计它会是这样的:

8 1 6
3 5 7
4 9 2

但结果是这样的:

0 9 0
3 0 8
7 0 2

我的代码有什么问题?我想不通

标签: c++

解决方案


if分支(未填充的正方形)中,填充一个正方形,然后设置ij指向下一个要填充的正方形。当你遇到一个填充的正方形(else分支)时,你会按照算法反转和向下的变化,ij填充它。但在那之后,你并没有像在分支中那样i进行j下一步的设置。if设置i并且j应该在两个分支中都有。这应该有效:

    if (magicsquares[i][j] == 0){
        magicsquares[i][j] = num++;
    } else{
        i = (i+2) % N;
        j = (j-1+N) % N;
        magicsquares[i][j] = num++;
    } 
    i = (i-1+N) % N;    /* Setting up i and j for next fill */
    j = (j+1) % N;      /* This should be done in both cases */

推荐阅读