HDU1998-奇数阶魔方 一个好玩的程序 按规则写蛮简单的
1 /*
2 N 为奇数时
3 (1) 将1放在第一行中间一列;
4
5
6 (2) 从2开始直到n×n止各数依次按下列规则存放:
7
8
9 按 45°方向行走,如向右上
10
11
12 每一个数存放的行比前一个数的行数减1,列数加1
13
14
15 (3) 如果行列范围超出矩阵范围,则回绕。
16
17
18 例如1在第1行,则2应放在最下一行,列数同样加1;
19
20
21 (4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
22
23
24 则把下一个数放在上一个数的下面。
25
26 */
27 #include<stdio.h>
28 int main()
29 {
30 int n,i, j,x,t ;
31 scanf("%d", &t);
32 while(t--)
33 {
34 scanf("%d", &n);
35 int a[100][100] = {0};
36 x = 1;
37 a[1][n/2+1] = 1;
38 i = 1;
39 j = n/2+1;
40 while(x<n*n)
41 {
42 if(i-1 == 0&&j!=n)
43 {
44 i = n;
45 j++;
46 a[i][j] = ++x;
47 }
48 else
49 if(j+1>n&&i!=1)
50 {
51 i--;
52 j = 1;
53 a[i][j] = ++x;
54 }
55 else
56 if(a[i-1][j+1]!=0||(i == 1&&j == n))
57 {
58 i++;
59 a[i][j] = ++x;
60 }
61 else
62 {
63 i--;
64 j++;
65 a[i][j] = ++x;
66 }
67 }
68 for(i = 1; i <= n ; i++)
69 for(j = 1 ; j <= n ; j++)
70 {
71 printf("%4d",a[i][j]);
72 if(j == n)
73 printf("\n");
74 }
75 }
76
77 return 0;
78 }