题目描述:
给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,例如:
1 2 3 4
5 6 7 8
9 10 11 12
“之”字形的打印结果为:
1,2,5,9,6,3,4,7,10,11,8,12
思路:采用两个点a,b都从左上角出发,a点只能向右走(aL++),走到头然后再向下走(aH++),b点只能向下走(bH++),走到头再向右走(bL++),a和b同步移动,两点之间的连线就是要打印的元素,如果上一次是从下向上打印,则下一次必定是从上向下打印,如此以往完成之字的打印
public class Code_009_ZigZagPrintMatrix {
public static void printMatrixZigZag(int[][] matrix) {
int aH = 0;
int aL = 0;
int bH = 0;
int bL = 0;
boolean fromDown = true;//控制下次打印的方向
while(aH != matrix.length) {
printLevel(matrix, aH, aL, bH, bL, fromDown);//打印对角线
//注意以下的书写顺序,对于a点来说,是列变化完以后,再有行的变化,
//也就是说行的变化的判断条件是列,所以要先书写行,避免列的变化的干扰
//对于b点同理
aH = aL == matrix[0].length - 1 ? aH + 1 : aH;
aL = aL == matrix[0].length - 1 ? aL : aL + 1;
bL = bH == matrix.length - 1 ? bL + 1 : bL;
bH = bH == matrix.length - 1 ? bH : bH + 1;
fromDown = !fromDown;//修改打印方向
}
}
public static void printLevel(int[][] matrix, int aH, int aL, int bH, int bL, boolean fromDown) {
if (fromDown) {
while(bH != aH - 1) {
System.out.print(matrix[bH--][bL++] + " ");
}
} else {
while(aL != bL - 1) {
System.out.print(matrix[aH++][aL--] + " ");
}
}
}
}