题目描述 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
思路
程序主要分为5部分,除了由n*n到(n+1)*(n+1)的向右自加,还有依次上,左,下,右四个步骤,,,
代码
#include<iostream>
using namespace std;
int main()
{
int n,num[99][99],sum=0;
cin>>n;
num[n/2][n/2]=1;
for(int i=0;i<=n/2-1;i++)
{
int p=n/2+i,q=n/2+i;
num[p][++q]=num[p][q-1]+1; //循环开始右1
for(int j=1;j<=i*2+1;j++) //上
{
num[p-1][q]=num[p][q]+1;
p=p-1;
}
for(int j=1;j<=2*i+2;j++) //左
{
num[p][q-1]=num[p][q]+1;
q=q-1;
}
for(int j=1;j<=2*i+2;j++) //下
{
num[p+1][q]=num[p][q]+1;
p=p+1;
}
for(int j=1;j<=2*i+2;j++) //右
{
num[p][q+1]=num[p][q]+1;
q++;
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cout<<num[i][j];
if(j==n-1)
cout<<endl;
else
cout<<' ';
}
for(int i=0;i<n;i++)
sum+=num[i][i]+num[n-1-i][i];
cout<<sum-1;
return 0;
}