题目描述 Description
小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
样例输入
3
样例输出
5 4 3
6 1 2
7 8 9
25
代码段:
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int i=n, j=n, x, k= n*n, sum=0, a[1024][1024];
for (x=1; n-x > 0; i--,j--,x++)
{
for (; j >= x; j--)//先往左,
a[i][j] = k--;
for (j++,i--; i >= x; i--)//再往上,
a[i][j] = k--;
for (i++,j++; j <= n + 1 - x; j++)//再往右,
a[i][j] = k--;
for (j--,i++; i <= n - x; i++)//再往下。
a[i][j] = k--;
}
//用来进行输出
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
printf("%d ", a[i][j]);
if (i + j == n + 1 || i == j)
sum += a[i][j];
}
printf("\n");
}
printf("%d", sum);
return 0;
}
思路理解:
1.整体思路是先找出最后一个数字的值,然后从最外层往最里层写
2.定义输入n, 矩阵a ,x和i、j用来控制往矩阵里写数字, sum用来计算对角线数字的和 ,k是最后一个数字的值的大小(比如,三行三列,则矩阵存的最后一个数字为3x3=9. )
3.循环的时候是从整个矩阵的外边往里边填,先往左,再往上,再往右,再往下。