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