魔方阵显示有问题,真的哭了

要哭了要哭了,这个3阶魔方阵后面的三位数字出不来


```c++
#include<stdio.h>
void main()
{
    int a[3][3]={0,0,0,0,0,0,0,0,0,},n,k=2,i,j;
    scanf("%d",&n);
    i=0;j=1;a[0][j]=1;
        
    for(k=2;k<=n*n;k++)
    {
        i=i-1;
        j=j+1;
        if(i<0&&j<n){i=(n-1);}//i=2
        else if(i<0&&j==n){i=2;j=0;}
        else if(i>=0&&j==n){j=0;}
        else;
        if(a[i][j]==0) {a[i][j]=k; }
        else {i=i+2;j=j-1;a[i][j]=k;}
    }
    for(i=0;i<n;i++)
    {for(j=0;j<n;j++) {printf("%3d",a[i][j]);}
    printf("\n");}
}    



![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/996202833586175.png "#left")

即数组 a 的第一行没有完全初始化,因为 i=0,j=1,a[0][0]、a[0][2] 这两个位置没有被赋值。这是因为在第一步时,将 i 设为了 -1,导致 a[2][1] 这个位置被赋上了 1,而 a[0][1] 没有被赋值。
解决这个问题很简单,在开始时,将 i 设为 n-1,j 设为 1 即可,即 i=n-1,j=1,a[i][j]=1。这样就能够保证第一行所有位置都被正确初始化了。
修改后的代码如下:

#include<stdio.h>
void main()
{
    int a[3][3]={0,0,0,0,0,0,0,0,0,},n,k=2,i,j;
    scanf("%d",&n);
    i=n-1;j=1;a[i][j]=1;
        
    for(k=2;k<=n*n;k++)
    {
        i=i-1;
        j=j+1;
        if(i<0&&j<n){i=(n-1);}
        else if(i<0&&j==n){i=2;j=0;}
        else if(i>=0&&j==n){j=0;}
        else;
        if(a[i][j]==0) {a[i][j]=k; }
        else {i=i+2;j=j-1;a[i][j]=k;}
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++) 
        {
            printf("%3d",a[i][j]);
        }
        printf("\n");
    }
}


我有个java实现的,稍等我改改给你
如下是 n阶魔方阵,参考

#include<stdio.h>
void main()
{
    int N;
    scanf("%d", &N);
    int arr[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            arr[i][j] = 0;
        }
    }

    int x = 0, y = N / 2; // 初始位置
    for (int i = 1; i <= N * N; i++) {
        arr[x][y] = i; // 填充当前位置

        // 计算下一个位置
        int nx = (x - 1 + N) % N;
        int ny = (y + 1) % N;

        if (arr[nx][ny] == 0) { // 下一个位置为空
            x = nx;
            y = ny;
        } else { // 下一个位置已被填充
            x = (x + 1) % N;
        }
    }


    for (int i1 = 0; i1 < N; i1++) {
        for (int j1 = 0; j1 < N; j1++) {
            printf("%-3d", arr[i1][j1]);
        }
        printf("\n");
    }
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^