Z字形打印二维数组

Z字形打印二维数组

题目简述

  • 给定一个N*M的整型二维数组,要求以(0,0)为起点,由外层向内层,按顺时针方向依次输出全部元素
    例如矩阵
    1 2 3 4
    5 6 7 8
    9 10 11 12

解题思路

分两种情况考虑上坡、下坡,再考虑边界问题。

  • 顺着斜线打印,其中斜线是需要转移的.
  • 思路: 其实这个Z形打印只有两种情况,就是上坡和下坡,再将边界问题一并考虑进去就可以解决一大部分问题。
  • 边界问题: 分为两种。第一种是在第一行列未到边界,在第一行列到边界;第二种是在第一列行未到边界,在第一列行到了边界。

1. while (r < m && c < n)设置边界
2. if (l2r) 判断是走下坡还是走上坡,第一步上坡 boolean l2r = true;
3. 再判断是 (在第一行,列未到边界) ,(在第一行,列到边界),继续上坡 。 为 (在第一行,列未到边界)(r == 0 && c < n - 1)
4. 向右边移动一位c++,且 l2r = !l2r; 交换方向
5. 再重新判断 if (l2r) (在第一列,行未到边界) ,(在第一列,行到了边界),继续下坡路 。 为继续下坡路
6. r++,c- -,行增,列减 此时在5的位置上
7. 此时未改变方向

源代码

public class Case02_print2DArr {
    public static void main(String[] args) {
        int[][] matrix = {
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
        };
        print(matrix);
    }
    static void print(int[][] matrix) {
        int r = 0, m = matrix.length;
        int c = 0, n = matrix[0].length;
        boolean l2r = true;//用一个布尔型变量来控制左到右,若为真就是从左到右,若为假就是从右到左
        while (r < m && c < n) {
            //从左下到右上的斜线
            if(l2r){
                System.out.println(matrix[r][c]+" ");
                //现在在第一行,列未到边界,这时只能向右走
                if (r == 0 && c < n - 1) {
                    l2r = !l2r;//方向切换
                    c++;
                    continue;
                } else if (r > 0 && c == n - 1) {//现在在最后一列,只能向下走
                    l2r = !l2r;
                    r++;
                    continue;
                }else {//继续向上走
                    r--;
                    c++;
                }
            }else {
                System.out.println(matrix[r][c] + "");
                if (c == 0 && r < m - 1) {//走到第一列,只能往下走
                    l2r = !l2r;
                    r++;
                    continue;
                } else if (r == m - 1) {//到最后一行,只能往右走
                    l2r = !l2r;
                    c++;
                    continue;
                }else {
                    r++;
                    c--;
                }
            }
        }
    }
}

测试结果

1 2 5 9 6 3 4 7 10 11 8 12
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值