22:神奇的幻方
- 总时间限制:
- 1000ms
- 内存限制:
- 65535kB
- 描述
-
幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方 - 输入
- 一个数字N(N<=20)
- 输出
- 按上方法构造的2N-1 * 2N-1的幻方
- 样例输入
-
3
- 样例输出
-
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
1 #include<iostream> 2 using namespace std; 3 int a[1001][1001]; 4 int now=1; 5 int tot=0; 6 int hang,lie; 7 int main() 8 { 9 int n; 10 cin>>n; 11 int c=2*n-1; 12 while(tot!=(c*c)) 13 { 14 if(tot==0) 15 { 16 a[1][c/2+1]=now; 17 now++; 18 hang=1; 19 lie=c/2+1; 20 tot++; 21 } 22 else if(hang==1&&lie!=c) 23 { 24 a[c][lie+1]=now; 25 now++; 26 tot++; 27 hang=c; 28 lie=lie+1; 29 } 30 else if(lie==c&&hang!=1) 31 { 32 a[hang-1][1]=now; 33 now++; 34 tot++; 35 hang=hang-1; 36 lie=1; 37 } 38 else if((hang==1&&lie==c)||(a[hang-1][lie+1]!=0)) 39 { 40 a[hang+1][lie]=now; 41 now++; 42 tot++; 43 hang=hang+1; 44 } 45 else 46 { 47 a[hang-1][lie+1]=now; 48 now++; 49 tot++; 50 hang=hang-1; 51 lie=lie+1; 52 } 53 } 54 for(int i=1;i<=c;i++) 55 { 56 for(int j=1;j<=c;j++) 57 { 58 cout<<a[i][j]<<" "; 59 } 60 cout<<endl; 61 } 62 return 0; 63 }
模拟。,,,,,,,,,,,