题目描述
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
输入
本题有多组数据,每组数据由一个正整数N组成。(N不大于100)
输出
对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。
样例输入复制
5样例输出复制
1 3 6 10 15 2 5 9 14 4 8 13 7 12 11
这道题是让输出一个蛇形矩阵,数组大致走向也可以看出,下面画一张图表示一下,可以更好的理解这个数组 (画图技术有限),其实从这道题给出的矩阵样子也可以大致看出这是一个二维数组,可以这样来理解一下,一维数组像直线,二维数组像平面
从上面可以看出,这个矩阵是一个斜着的Z字递增,括号里面是数组下标
思路:观察数组发现(斜着看)
i对应这行数(竖着的0-4),j对应列数
i j 0 1 2 3 4
0 1 3 6 10 15
1 2 5 9 14
2 4 8 13
3 7 12
4 11
1,每一行的结果都是右上方值-1
2,想算出第2行就要算出第一列
3,想算出第1行就要算出第1列
第 i 行的左边界值是第 j -1 列上边界值 +1
第 j 列的上边界是第 i 行左边界的值 + i
由此先把左和上边界算出来
int arr[][] = new int[n+1][n+1];//数组长度加1防止越界
arr[0][0] = 1;
for (int i = 1; i < n; i++) {
arr[i][0] = arr[0][i-1] + 1;//左边界
arr[0][i] = arr[i][0] + i;//上边界
}
这时二维数组是这个样子
开始计算里面的数值
5 9 14
8 13
12
发现,arr[i][j]的值是arr[i-1][j+1]-1,即当前位置值是右上方值-1
为什么不是右下方值+1?一开始我也是拿右下方的值算发现是错的,因为我们看出算出边界之后二维数组里面的值是0,比如我们计算9这个位置的值,会发现9的右下方是0,+1之后变成1,根本算不出9,而右上方的值正好是边界值,已经被算出来了
for (int i = 1; i < n ; i++) {
for (int j = 1; j < n; j++) {
arr[i][j] = arr[i-1][j+1]-1;
}
}
想想一下,两个for循环一下就是一层一层的往下计算值,所以要拿右上方的值去当做参考值计算
最后我们输出(这是个错误输出)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {//注意这是j<n
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
每一行输出都比上一行上一列,题目是n=5,i=0时候输出5列,i=1时输出4列,i=2时输出3列...
以此类推输出的列就是n-i
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-i; j++) {//这里是j<n-i
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
完整代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//行数
int[][] arr = new int[n+1][n+1];
arr[0][0] = 1;
for (int i = 1; i < n; i++) {
arr[i][0] = arr[0][i-1] + 1;
arr[0][i] = arr[i][0] + i;
}
for (int i = 1; i < n ; i++) {
for (int j = 1; j < n; j++) {
arr[i][j] = arr[i-1][j+1]-1;
}
}
//输出蛇形数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-i; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}