这里可以把题目简化,把Z字形看成是斜着打印数组,比如2-5就是从上往左下打印,然后9-6-3就是从左往右上斜着打印,搞清楚这点后,线上代码和运行结果:
import java.util.Scanner;
public class A019_Z形打印_简化问题 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = 5;
int n = 5;
int[][] arr = new int[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
arr[i][j] = sc.nextInt();
int r = 0, c = 0;
boolean flag = true;
while (r < m && c < n) {
if (flag) {
System.out.print(arr[r][c] + " ");
if (r == 0 && c < n - 1) {
flag = !flag;
c++;
continue;
} else if (r >= 0 && c == n - 1) {
flag = !flag;
r++;
continue;
} else {
r--;
c++;
}
} else {
System.out.print(arr[r][c] + " ");
if (c == 0 && r < m - 1) {
flag = !flag;
r++;
continue;
} else if (c >= 0 && r == m - 1) {
flag = !flag;
c++;
continue;
} else {
r++;
c--;
}
}
}
}
}
基础的输入啥的就不说了,首先定义三个变量,r和c分别是行和列,flag是往哪个方向斜着打印,true就是从左向右上斜着打印。
进入循环:
首先判断flag的值,确定打印的方向,首先把元素进行输出,然后判断r和c的值,首先是走到上面的情况,也就是刚进来的第一行,第一列的那个元素,如果这个时候的行是0,也就是到边界了,而且列是小于总列数的,那么就向右走一步,而且把flag的值反一下,表示接下去会打印另一个方向,如果这个时候的列已经到头了,并且行没到边界的话,那么就往下走,也就是r++;
这里再捋一下思路,
1、行==0以及c<n-1;这个情况的话,就说明行走到头了,但是列没,所以就要列++向右移一个,并且flag取反;
2、r >= 0 && c == n - 1;这个情况,就说明列走到头了,但是行还没,所以就要行++向下移一个,这里可以参考走到顶点的情况
3、其他情况的话,那就正常按照斜着打印的方向走,比如从右到左下这样斜着,就是行++,列–;