题目描述
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
测试点#snake1.in 结果: 内存使用量: 256kB 时间使用量: 1ms
测试点#snake2.in 结果: 内存使用量: 256kB 时间使用量: 1ms
测试点#snake3.in 结果: 内存使用量: 256kB 时间使用量: 1ms
测试点#snake4.in 结果: 内存使用量: 256kB 时间使用量: 1ms
测试点#snake5.in 结果: 内存使用量: 256kB 时间使用量: 2ms
下面给出代码:
# include <iostream>
using namespace std;
int main() {
int n, s[110][110], x = 51, y = 52, t = 2, num = 3, sum = -1;
cin >> n;
s[51][51] = 1; s[51][52] = 2;
while(num <= n) { //下列用逆时针填法。
while(x > 51 - (num - 1) / 2) s[--x][y] = ++t; //右填数
while(y > 51 - (num - 1) / 2) s[x][--y] = ++t; //上填数
while(x < 51 + (num - 1) / 2) s[++x][y] = ++t; //左填数
while(y < 52 + (num - 1) / 2) s[x][++y] = ++t; //下填数,这里52是在矩阵右下角后再加下一个数,保证下次循环可接。
num += 2;
}
for(int i = 51-(n-1)/2; i <= 51+(n-1)/2; i++){
for(int j = 51-(n-1)/2; j <= 51+(n-1)/2 ;j++)
cout << s[i][j] << " ";
cout << endl;
}
for(int i = 51-(n-1)/2; i <= 51+(n-1)/2; i++) sum += s[i][i]; //左倾对角线。
for(int i = 51+(n-1)/2; i >= 51-(n-1)/2; i--) sum += s[102-i][i]; //右倾对角线,Y是加,X是减,变量只有i,所以用X=102-i。
cout << sum; //设变量时sum=-1,因为两次对角线都经过了中心s[51][51]=1,所以要减去一个1。
return 0;
}