算法初级——“之”字形打印矩阵

“之”字形打印矩阵
【题目】 给定一个矩阵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
【要求】 额外空间复杂度为O(1)。
/*给定一个矩阵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
* 上方一个坐标(ar,ac),先向右移动,移动到最右端则向下移动
* 左面一个坐标(br,bc),先向下移动,移动到最下端则向右移动,初始位置都是(0,0)
* 终点位置(endr,endc)
* 然后实现对角线打印,通过布尔类型的变量控制对角线打印的方向
*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class 之字形打印矩阵 {

    public static void main(String[] args) {
        int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
        printMatrixZigZag(matrix);
    }

    private static void printMatrixZigZag(int[][] matrix) {
        int ar = 0;
        int ac = 0;
        int br = 0;
        int bc = 0;
        int endr = matrix.length - 1;
        int endc = matrix[0].length - 1;
        boolean from = false;
        while(ar != endr) {
            printzhi(matrix,ar,ac,br,bc,from);
            ar = ac==endc ? ar+1 : ar;  
            ac = ac==endc ? ac : ac+1;  
            bc = br==endr ? bc+1 : bc;  
            br = br==endr ? br : br+1;
            from = !from;
        }
    }

    private static void printzhi(int[][] matrix, int ar, int ac, int br, int bc, boolean from) {
        if(from) {
            while(ar != br+1) {
                System.out.print(matrix[ar++][ac--]+" ");
            }          
        }else {
            while(br != ar-1){  
                System.out.print(matrix[br--][bc++]+" ");  
            }      
        }      
    }

}
0 条评论
发表一条评论