牛客小白月赛2 A-数字方阵
链接:[https://www.nowcoder.com/acm/contest/86/A](https://www.nowcoder.com/acm/contest/86/A)
来源:牛客网
题目描述
Etéreo总是对数字的神秘感感到好奇。这次,他在纸上写下了 n2 n 2 个从1到 n2 n 2 的数字,并把这些数字排成了n*n的方阵。他惊奇地发现,这个方阵中每行、每列和两条主对角线上的数字之和都不一样。他想要更多的方阵,但他再写不出来了。于是他㕛跑来找你,请你给他一个边长为n的满足上述性质的方阵。
输入描述:
输入共一行,一个整数n,意义同题面描述。
输出描述:
输出共n行,每行n个整数,表示答案方阵。
输出任意一种可行方案即可。
示例1
输入
3
输出
1 2 3
8 9 4
7 6 5
备注:
3 <= n <= 1000
思路
在别人的提交中看到了一种非常优雅的解法。至于作者是怎么想出来的,我也不太清楚。忍不住记下来膜拜一下。
题中有提到:输出任意一种可行方案即可。证明正确的答案不止一个,让我好奇它的判定。一般而言,方阵中的元素都是确定(1到n*n),然后每行每列的数字之和加起来也是确定值,必然是两倍的方阵元素之和。
最后考虑对角线上的元素。emmmm。。。总之,题解牛逼!
AC代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int r=1,l=(n-1)*n+1;
for(int i=0; i<n; i++) {
for(int j=1; j<n; j++) {
cout << r++ << " ";
}
cout << l++ << endl;
}
return 0;
}