C语言网 题目 1097: 蛇行矩阵

题目描述

蛇形矩阵是由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();
        }

    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值