时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题目描述 Description
小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
输入描述 Input Description
n(即n行n列)
输出描述 Output Description
n+1行,n行为组成的矩阵,最后一行为对角线数字之和
样例输入 Sample Input
3
样例输出 Sample Output
5 4 3 6 1 2 7 8 9 25
1 #include<iostream>
2 using namespace std;
3 int now=1;
4 int a[101][101];
5 int s=0;
6 int fx=1;// 1右 2左 3上 4下
7 int tot=1;
8 int ans=0;
9 int main()
10 {
11 int n;
12 cin>>n;
13 s=n/2+1;
14 int i=s;
15 int j=s;
16 a[i][j]=now;
17 now++;
18 while(tot!=n*n)
19 {
20 if(fx==1&&j-i==1)
21 {
22 fx=3;
23 //a[i][j]=now;
24 //now++;
25 // tot++;
26 }
27 if(fx==2&&i==j)
28 {
29 fx=4;
30 //a[i][j]=now;
31 // now++;
32 // tot++;
33 }
34 if(fx==3&&(i+j==n+1))
35 {
36 fx=2;
37 //a[i][j]=now;
38 // now++;
39 // tot++;
40 }
41 if(fx==4&&(i+j==n+1))
42 {
43 fx=1;
44 //a[i][j]=now;
45 // now++;
46 // tot++;
47 }
48 if(fx==1)// 1右 2左 3上 4下
49 {
50 j++;
51 a[i][j]=now;
52 now++;
53 tot++;
54 }
55 if(fx==2)// 1右 2左 3上 4下
56 {
57 j--;
58 a[i][j]=now;
59 now++;
60 tot++;
61 }
62 if(fx==3)// 1右 2左 3上 4下
63 {
64 i--;
65 a[i][j]=now;
66 now++;
67 tot++;
68 }
69 if(fx==4)// 1右 2左 3上 4下
70 {
71 i++;
72 a[i][j]=now;
73 now++;
74 tot++;
75 }
76 }
77 for(int i=1;i<=n;i++)
78 {
79 for(int j=1;j<=n;j++)
80 {
81 cout<<a[i][j]<<" ";
82 if((i+j==n+1)||(i==j))
83 ans=ans+a[i][j];
84 }
85 cout<<endl;
86 }
87 cout<<ans;
88 return 0;
89 }