题目描述 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
数据范围及提示 Data Size & Hint
奉上代码:
#include<bits/stdc++.h> #define N 100005 #define ll long long #define RE register #define max(a,b) (a>b?a:b) using namespace std; void read(int &x){ int flg=1;x=0;RE char ch=getchar(); if(ch=='-') flg=-1; for(;ch>'9'||ch<'0';) ch=getchar(); for(;ch<='9'&&ch>='0';ch=getchar()) x=x*10+ch-'0'; x*=flg; } int n,a[105][105],tp,t,x,y,ans,k; int mx[4]={0,-1,0,1}, my[4]={1,0,-1,0}; int main() { read(n); k=tp=1;x=n/2+1;y=n/2+1;a[x][y]=tp; while(1){ for(int i=1;i<=tp;i++){ x+=mx[t];y+=my[t]; a[x][y]=++k; }++t; if(t==2||t==4) tp+=1; if(t==4) t=0; if(x==n&&y==n+1) break; }for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%d ",a[i][j]); if(i==j||i+j==n+1) ans+=a[i][j]; }printf(" "); }printf("%d",ans); return 0; }