Z形打印二维数组
思路: 其实这个Z形打印,无非就两种情况(上坡,下坡)两种路,然后再考虑他的边界问题即可解决。
边界问题: 又分为两种一种是 (在第一行,列未到边界) ,(在第一行,列到边界)。第二种 (在第一列,行未到边界) ,(在第一列,行到了边界)。
具体思路:
while (r < m && c < n)
设置边界if (l2r)
判断是走下坡还是走上坡,第一步上坡boolean l2r = true;
- 再判断是 (在第一行,列未到边界) ,(在第一行,列到边界),继续上坡 。 为 (在第一行,列未到边界)
(r == 0 && c < n - 1)
- 向右边移动一位c++,且 l2r = !l2r; 交换方向
- 再重新判断
if (l2r)
(在第一列,行未到边界) ,(在第一列,行到了边界),继续下坡路 。 为继续下坡路 - r++,c- -,行增,列减 此时在5的位置上
- 此时未改变方向,所以还是。。。。。。。。自己想吧
总结: 其实就是这么简单,两种情况考虑上坡、下坡。然后再考虑边界问题,边界问题就是上面讲的。
public class Z形打印二维数组 {
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.print(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.print(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--;
}
}
}
}
}