题目描述 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
//规律:从中心开始,移动的顺序为右、上、左、下
//从中心点a[n/2][n/2]移动的次数分别为向右1次,向上1次,向左2次,向下2次,向右3次,向上3次,向左4次,向下4次等等循环下去。
//循环终止的条件为count==n
#include <iostream>
using namespace std;
int number=1;
int step=1;
int Way(int a[100][100],int n)
{
int c_start,r_start;
int i,count=0;
c_start=r_start=n/2;
a[c_start][r_start]=number;
while(1)
{
if(step%2!=0)
{
i=0;
while(i!=step)
{
//右移动
c_start++;
number++;
a[r_start][c_start]=number;
count++;i++;
if(count==n*n) return 1;
}
i=0;
while(i!=step)
{
//上移动
r_start--;
number++;
a[r_start][c_start]=number;
count++;i++;
}
step++;
}
else if(step%2==0)
{
i=0;
while(i!=step)
{
//左移动
c_start--;
number++;
a[r_start][c_start]=number;
count++;i++;
if(count==n*n) break;
}
i=0;
while(i!=step)
{
//下移动
r_start++;
number++;
a[r_start][c_start]=number;
count++;i++;
}
step++;
}
}
}
int Duijiao(int a[100][100],int n)
{
int j,i;
int result=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j||i+j==n-1)
{
result+=a[i][j];
}
}
// result-=a[n/2][n/2];
return result;
}
int main()
{
int a[100][100];
int i,j,n,result;
cin>>n;
Way(a,n);
result=Duijiao(a,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<result;
}