题目描述
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
#include<iostream>
using namespace std;
int main()
{
int n,q,x,y=0,ans=0;
int a[100][100]={-1};
cin>>n;
q=(n+1)/2;
a[q][q]=1;
for(int i=q;i>1;i--)//q圈
{
x=2*i-1;
a[x+y][x+y]=x*x;
for(int j=1;j<=x-1;j++)
{
a[x+y][x+y-j]=a[x+y][x+y-j+1]-1;
}
for(int j=1;j<=x-1;j++)
{
a[x+y-j][1+y]=a[x+y-j+1][1+y]-1;
}
for(int j=1;j<=x-1;j++)
{
a[1+y][1+y+j]=a[1+y][j+y]-1;
}
for(int j=1;j<=x-2;j++)
{
a[1+y+j][x+y]=a[j+y][x+y]-1;
}
y++;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<a[i][j]<<' ';
if(i==j){ans=ans+a[i][j];}
if(i+j==n+1){ans=ans+a[i][j];}
}
cout<<endl;
}
ans=ans-1;
cout<<ans;
return 0;
}