cuitao42


私信TA

用户名:dotcpp0634607

访问量:497

签 名:

等  级
排  名 170
经  验 6976
参赛次数 0
文章发表 18
年  龄 10
在职情况 学生
学  校
专  业

  自我简介:

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

        ⑴将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 人评分

  评论区

  • «
  • »