#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int n;
#ifdef Serpentine_matrix
/*
方法一
思路:一个n*n矩阵,只填充上半矩阵,右上角进行填充,横坐标递减,纵坐标递增,
例如[0,0];[-1, 0]、[0, 1];[-2, 0] 、[-1, 1]、[0, 2];
[-3, 0]、[-2, 1] [-1, 2] [0, 3]
*/
while(cin>>n) {
vector<vector<int>> matrix(n, vector<int>(n, 0)); //n*n
int num = 1;
for(int i = 0; i < n; i++) {
int j = i, k = 0;
while(j >= 0) {
matrix[j][k] = num;
num++;
j--;
k++;
}
}
for(int i = 0; i < n; i++) {
int j = 0;
while(matrix[i][j] != 0 && j < n) {
cout<<matrix[i][j]<<" ";
j++;
}
cout<<endl;
}
}
#else
/*
数学规律
具体做法:
仔细观察这样的蛇形矩阵,我们可以尝试找规律:
对于每一行第一个元素,我们发现2与1之间相差为1,4与2之间相差为2,7与4之间相差为3,11与7之间相差为4,则第iii行的第一个元素与它的下一行是相差
了个行号(从1开始)。
对于每一行的每个元素,我们发现3与1之间相差为2,6与3之间相差为3,10与6之间相差为4,15与10之间相差为5,则第jjj列与它的前一列相差为其列号
(从1开始)。
*/
while(cin>>n) {
int k = 1; // 起始元素1
for(int i = 1; i <= n; i++) {
cout<<k<<" "; // 输出每行首
int temp = k;
for(int j = i + 1; j <= n; j++) {
temp += j; // 一行的列相差j: 2、3、4 、5; 1 + 2 = 3;3 + 3 =6;6 + 4 = 10
cout<<temp<<" ";
}
cout<<endl;
k += i; //下一行, 1 + 1= 2; 2 + 2=4; 4 + 3 =7
}
}
#endif
}