魔方阵(C语言)数组

所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。要求输出1,,n^2的自然数构成的魔方阵
81 6
357
492
n阶魔方阵的构造方法为:
1)首先把1放在顶行的正中间,然后把后继数按顺序放置在右上方位置;
2)当到达顶行时,下一个数放到底行,好像它在顶行的上面;例如上图中的数字2
3)当到达最右列时,下一个数放在最左端列,好像它仅靠在右端列的右方;例如上图中的数字3.
当到达的位置已经填好数时,或到达右上角的位置时,下一个数就放在刚填写的位置的正下方。例如上图中的数字4和7

如下是 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");
    }
}

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7621037
  • 除此之外, 这篇博客: 数字三角形 给定一个由n行数字组成的数字三角形,试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。中的 给定一个由n行数字组成的数字三角形,试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 题目:
    问题:
      给定一个由n行数字组成的数字三角形,如下图所示:
       7
       3 8
       8 1 0
       2 7 4 4
       4 5 2 6 5
      试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。
    输入:
      第一行是数字三角形的行数,接下来 n 行是数字三角形中的数字。  
      比如:
      5
      7
      3 8
      8 1 0
      2 7 4 4
      4 5 2 6 5  
    输出:
    输出这个最大值。
      
    这里只给出代码,步骤分析看链接:步骤详解

    代码实现:
    代码注释的部分构成方法二

    #include<stdio.h>
    #include<math.h>
    #include <windows.h>
    #define N 5
    int a[6][6];
    int sum[6][6];
    int sum_two[6];
    int main()
    {
        int i,j;
        for (i=1;i<=5;i++)
            for (j=1;j<=i;j++)
                scanf("%d",&a[i][j]);
        for (i=1;i<6;i++)
            {
                sum[5][i] = a[5][i];
               // sum_two[i] = a[5][i];
            }
        for (i=5-1;i>=1;i--)
            for (j=1;j<=i;j++)
                {
                    sum[i][j] = max(sum[i+1][j],sum[i+1][j+1]) + a[i][j];
                    //sum_two[j] = a[i][j] + max(sum_two[j],sum_two[j+1]);
                }
        for (i=1;i<6;i++)
            {
                for (j=1;j<=i;j++)
                printf("%3d",sum[i][j]);
                printf("\n");
            }
        //printf("%d",sum_two[1]);
        return 0;
    }