题目描述
给你一个整数n,输出n∗n的蛇形矩阵。 输入描述: 输入一行,包含一个整数n 输出描述: 输出n行,每行包含n个正整数,通过空格分隔。
1<=n<=1000
示例1
输入
4
输出
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
输入n,生成n * n的蛇形矩阵。对于沿着主对角线,与主对角线垂直的斜线一共又2*n-1条(包括两个端点),并且,这每一条线上的元素横纵坐标之和为一个定值2n-2。
如4 * 4矩阵
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
其中一条斜线num[2][0]=4,num[1][1]=5,num[0][2]=6,其横纵下标之和皆为2。
本题分为两个部分看,一部分是反对角线以上(含反对角线),当下标之和为奇数时,行坐标递增,列坐标递减,开头的行坐标为0。当下标之和为偶数时,行坐标递减,列坐标递增,开头的行坐标为i。
另一部分是反对角线以下,当i为奇数时开头必在列坐标为n-1上,当i为偶数时开头必在行坐标为n-1上,并且递减,与另一个坐标的关系为i-(n-1)。
根据横纵坐标之和为定值,以上两种情况皆可通过定值i减去横/纵坐标,计算出对应的横/纵坐标。
个人认为知道规律后,关键是确定好起始坐标,及横纵坐标递减或递增的最大/最小值。
复制代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include using namespace std; int main() { int i, j, n, count = 1; cin>>n; int num[n][n]; for (i = 0; i < n; i++) { if (i % 2 == 0) { for (j = i; j >= 0; j--) num[j][i - j] = count++; } else { for (j = 0; j <= i; j++) num[j][i - j] = count++; } } for (i = n; i <= 2 * n - 1; i++) { if (i % 2 == 0) { for (j = n - 1; j >= i - (n - 1); j--) num[j][i - j] = count++; } else { for (j = n - 1; j >= i - (n - 1); j--) num[i - j][j] = count++; } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) cout< cout< } return 0; } |
C++C数组



