小明玩一个数字游戏,取个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>
#include<algorithm>
#include<memory.h>
using namespace std;
int n;
int a[101][101];
int num = 1;//记录当前的数字
int row=50, col=50;//记录当前的行列号
int sum = 1;//记录对角线的和
int flag[4];//对四角的数字进行标记
int main()
{
a[50][50] = 1;//将中心初始化为1
cin >> n;
for (int i=3;i<=n;i=i+2)
{
memset(flag, 0, sizeof(flag));
col++;//每一圈的开始都是要先向右走一步
num++;
a[row][col] = num;
for (int j=1;j<(i-1)*4;j++)//计算可知每一圈元素的个数为4*n-4,减去的4是重复计算的,n圈的大小
{//整个循环进行4*(i-1)-1次,因为在外面已经走了一步
if (j < i - 1)
{//向上走
row--;
num++;
a[row][col] = num;
}
else if (j < 2 * (i - 1))
{//向左走
if (flag[0]==0)
{
flag[0] = 1;
sum += num;//右上角
}
col--;
num++;
a[row][col] = num;
}
else if (j < 3 * (i - 1))
{//向下走
if (flag[1] == 0)
{
flag[1] = 1;
sum += num;//左上角
}
row++;
num++;
a[row][col] = num;
}
else
{//向右走
if (flag[2] == 0)
{
flag[2] = 1;
sum += num;//左下角
}
col++;
num++;
a[row][col] = num;
}
}
sum += num;//右上角
}
for (int i=50 - n / 2;i<= 50 + n / 2;i++)
{
for (int j= 50 - n / 2;j<= 50 + n / 2;j++)
cout << a[i][j] << " ";
cout << endl;
}
cout << sum;
cin >> n;
return 0;
}