答题思路:(百度百科)传统魔方阵的排列规律如下:

        ⑴将1放在第一行中间一列

        ⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);

        ⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;

        ⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;

        ⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面。

  
注意事项: 这道题是把传统幻方倒着输出的,比如第一行放在最后一行,第二行在倒数第二行. . . ,只需要在最后输出的时候把行倒叙输出即可。

参考代码:

#include <stdio.h>
int main(){
    int n, i, j, t, x, m;
    while (scanf("%d", &n) && n) {
        int a[31][31] = { 0 };
        a[1][(n + 1) / 2] = 1; t = 2; x = 1;
        for (i = n, j= (n + 1) / 2 + 1; t <= n * n; i--, j++, t++) {
            if (a[i][j] != 0) {
                i = i + 2;
                j--;
            }
            if (j > n && i >= 1) j = 1;
            if (i < 1 && j <= n) i = n;
            if (i < 1 && j > n) {
                i = i + 2; 
                j--;
            }
            a[i][j] = t;
        }
        m = n*n;
        while (m != 0) {
            m = m / 10;
            x = x * 10;
        }
        x = x / 10; 
        for (i = n ; i >= 1; i--) {
            for (j = 1; j <= n; j++) {
                if(x == 1) printf("%d", a[i][j]);
                if (x == 10) printf("%2d", a[i][j]);
                if (x == 100) printf("%3d", a[i][j]);
                if (j != n) printf(" ");
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论