答题思路:(百度百科)传统魔方阵的排列规律如下:
⑴将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 人评分
A+B for Input-Output Practice (IV) (C++代码)浏览:713 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:1052 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C语言代码)浏览:636 |
1014题解浏览:524 |
Tom数 (C语言代码)浏览:517 |
C语言程序设计教程(第三版)课后习题12.2 (C语言代码)浏览:839 |
简单的a+b (C语言代码)浏览:857 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:476 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:576 |
老王赛马 (C++代码)浏览:973 |