谁能解释一下(标签-c++)

谁能解释一下这是什么现象:
题目:

魔幻方阵

时间限制:0秒 内存限制:0M

题目描述

行数等于列数的矩阵又被称为方阵。现有一个奇数n,要求把1~nn之间(包含1和nn)的正整数变成n行的方阵,并且方阵中的每行,每列和主副对角线上的数字之和都相同。

输入描述

输入一个奇数n,n是正整数,且小于20。

输出描述

输出n行,每行n个正整数,构成这个方阵。

样例

输入

 5

输出

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

代码①:

#include<iostream>
#include<iomanip>

using namespace std;

int main(){
    int n,i=1,j=(n+1)/2,x,y,box[21][21]={0};
    cin>>n;
    box[i][j]=1;
    for(int a=2;a<=n*n;a++){
        if(i==1){
            x=n;
        }
        else{
            x=i-1;
        }
        if(j==n){
            y=1;
        }
        else{
            y=j+1;
        }
        if(box[x][y]==0){
            box[x][y]=a;
            i=x;
            j=y;
        }
        else{
            i++;
            box[i][j]=a;
        }
    }
    for(int a=1;a<=n;a++){
        for(int b=1;b<=n;b++){
            cout<<setw(5)<<box[a][b];
        }
        cout<<"\n";
    }
    
    return 0;
}

结果输出了:

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

改了下i和j定义的位置:

#include<iostream>
#include<iomanip>

using namespace std;

int main(){
    int n,x,y,box[21][21]={0};
    cin>>n;
    int i=1,j=(n+1)/2;
    box[i][j]=1;
    for(int a=2;a<=n*n;a++){
        if(i==1){
            x=n;
        }
        else{
            x=i-1;
        }
        if(j==n){
            y=1;
        }
        else{
            y=j+1;
        }
        if(box[x][y]==0){
            box[x][y]=a;
            i=x;
            j=y;
        }
        else{
            i++;
            box[i][j]=a;
        }
    }
    for(int a=1;a<=n;a++){
        for(int b=1;b<=n;b++){
            cout<<setw(5)<<box[a][b];
        }
        cout<<"\n";
    }
    
    return 0;
}

结果……

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

竟然对了!
谁能解释一下

你得先输入n再用n的值啊

【以下回答由 GPT 生成】

魔幻方阵是由一个奇数n生成的方阵,方阵中的每行、每列和主副对角线上的数字之和相同。要求解决的问题是给定一个奇数n,生成一个n行n列的方阵,其中方阵的每行、每列和主副对角线上的数字之和都相等。

解决方案如下:

  1. 首先判断输入的n是否为奇数且小于20,如果不符合要求,则输出错误信息。

  2. 创建一个n行n列的二维数组matrix用于存储方阵。

  3. 初始化方阵的中心位置为1,即matrix[n/2][n/2] = 1。

  4. 创建两个变量row和col用于记录当前位置的行和列,初始值为n/2和n/2。

  5. 创建一个变量num用于记录当前要填充的数字,初始值为2。

  6. 使用循环从2到n^2循环遍历每个数字,通过以下步骤填充方阵:

6.1. 向上移动一行(row = row - 1),向右移动一列(col = col + 1)。

6.2. 如果所移动的位置超出方阵的边界,则将行或列的值调整为合法值。如果行小于0,则将行的值调整为n-1;如果列大于等于n,则将列的值调整为0。

6.3. 如果当前位置已经有数字,则向下移动一行(row = row + 1)。

6.4. 在当前位置填充数字num(matrix[row][col] = num)。

6.5. 将num的值加1(num = num + 1)。

  1. 完成循环后,输出生成的方阵。

代码实现如下(使用Python语言):

def generate_magic_square(n):
    if n % 2 == 0 or n >= 20:
        print("输入的n不符合要求")
        return

    matrix = [[0] * n for _ in range(n)]
    row = n // 2
    col = n // 2
    num = 1

    matrix[row][col] = num
    num += 1

    while num <= n ** 2:
        row -= 1
        col += 1

        if row < 0:
            row = n - 1
        if col >= n:
            col = 0

        if matrix[row][col] != 0:
            row += 1

        matrix[row][col] = num
        num += 1

    for i in range(n):
        for j in range(n):
            print(matrix[i][j], end="\t")
        print()

n = int(input("请输入一个奇数n: "))
generate_magic_square(n)

输入:

请输入一个奇数n: 5

输出:

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


【相关推荐】


  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1083834
  • 除此之外, 这篇博客: C++数据结构实验三 字符串和数中的 2.实现奇数阶幻方。在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行的几个数之和都相等,具有这种性质的图表,称为“幻方”。按目前填写幻方的方法,是把幻方分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方。奇数阶幻方的方法比较简单,这里只考查奇数阶幻方的程序。输入 30 以内的任一奇数 n,自动输出 n*n 阶幻方。如: 部分也许能够解决你的问题。

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