时间限制: 1 s
空间限制: 128000 KB
题目描述 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
#include<cstdio> #include<cmath> #include<cctype> #include<iostream> #include<vector> #include<cstring> #include<algorithm> #include<map> #include<set> #include<cstddef> #include<sstream> #include<cstdlib> #include<stack> #include<queue> using namespace std; //本来想绕圈填数组的 但是发现总是不行。于是就直接输出了 //寻找下标和元素的关系,这是一道数学题。 int main(){ int n; cin >> n; if(0 == n % 2) return 0;//虽然数据是不可能含偶数。 int m, ctr = n/2; int sum = 0, t; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { //按顺序输出 m = max(abs(i-ctr), abs(j-ctr));//abs是绝对值, m = 2 * m + 1; if(((ctr-i)==(m-1)/2) || ((ctr-j)==(m-1)/2)) t = m*m-2*m-j+i+2; else if((i-ctr)==(m-1)/2) t = m*m-m+1+j-2*ctr+i; else t = m*m-3*m+3+2*ctr-i-j; cout << t << " "; if(i==j || (i+j)==(n-1))//对角线 sum += t; } cout << endl; } cout << sum << endl; return 0; }
复制去Google翻译翻译结果
时间: 2024-11-10 00:18:13