题目看图:
这个题目给人的第一感觉就是,这个出题人脑子又泡吧。之字形打印?太无聊了,其实这个是一种宏观调度思想的实例。我前面也有写过两个相关题目:转圈打印,旋转矩阵
讲讲思路:如果限制自己的思路,这个题目是十分难以实现的,和前面两个题目一样,需要两个点来控制走向A(aR,aC),B(bR,bC)(行,列).A点只向右走,当走到最右点的时候,就向下走,B点向下走,当到达最下点的时候就向右走,这样就形成了一个左上到右上的连线,依次将这些点打印粗来就欧克了。
下面看代码:
/**
* 之字形打印一个矩阵
* 例如:
* 1 2 3
* 4 5 6
* 7 8 9
* 打印:1,2,3,7,5,3,6,8,9
* 思路:设置两个点A(aR,aC),B(bR,bC)(行,列)
* A向右走,当到最右点的时候,向下走
* B向下走,当到最下点的时候,向右走
* 设置一个布尔变量表示从上到下还是从下到上打印
* 当aR到最后一行的时候 或者 当bC到最后一列的时候标志着打印结束
*/
public class C07_ZigZagPrintMatrix {
public static void zigZagPrintMatrix(int[][]matrix){
if(matrix==null || matrix.length==0 || matrix[0].length==0){
return ;
}
int aR = 0;//行
int aC = 0;//列
int bR = 0;//行
int bC = 0;//列
int endR = matrix.length-1;//行结束位置
int endC = matrix[0].length-1;//列结束位置
boolean fromUp = false;
while(aR != matrix.length){
printMatrix(matrix, aR, aC, bR, bC, fromUp);
aR = aC==endC ? aR+1 : aR;
aC = aC==endC ? aC : aC+1;
bC = bR==endR ? bC+1 : bC;
bR = bR==endR ? bR : bR+1;
fromUp = !fromUp;
}
}
public static void printMatrix(int[][]matrix,int aR,int aC,
int bR,int bC,boolean fromUp){
if(fromUp){
while(aR!= bR+1){
System.out.print(matrix[aR++][aC--]+" ");
}
}else {
while(bR != aR-1){
System.out.print(matrix[bR--][bC++]+" ");
}
}
}
public static void main(String[] args) {
int matrix[][] = new int[][]{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10,11, 12},
{13,14,15, 16}
};
zigZagPrintMatrix(matrix);
}
}