小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
n(即n行n列)
n+1行,n行为组成的矩阵,最后一行为对角线数字之和
3
5 4 3
6 1 2
7 8 9
25
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
using namespace std;
stack <char> s;
int main()
{
int a[101][101];
int i, j, s = 0, n;
scanf("%d", &n);
int flag = n * n;
memset(a, 0, sizeof(a));
i = n;
j = n + 1;
while (flag > 0)\\顺序是固定的
{
while(a[i][j - 1] == 0 && j > 1)\\因为有==0的条件,所以已经包含了所有情况,不含有覆盖情况
a[i][--j] = flag--;
while (a[i - 1][j] == 0 && i > 1)
a[--i][j] = flag--;
while (a[i][j + 1] == 0 && j < n)
a[i][++j] = flag--;
while (a[i + 1][j] == 0 && i < n)
a[++i][j] = flag--;
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (i == j || i + j == n + 1)
s += a[i][j];
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("%d", s);
return 0;
}