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


【要求】 額外空間複雜度為O(1)。

 

思路:

使用巨集觀思想,千萬不要把思路限制在區域性。

①設計A,B指標一開始都在(0,0)位置

②A總是向右移動,B總是向下移動,當A運動到最右,往下移動,當B運動到最下,往右移動【A、B每次都走一步】,A和B每次都可以劃出一個對角線。

       

最後A、B重合,我們只需要做的就是,通過A,B兩個座標,打印出對角線上的值,而之字型列印是有順序的【左下到右上還是右上到左下】,我們只需要認為引入一個boolean量做區分即可。

 

具體程式碼實現:

/**
 * 之字形列印
 */
public class ZigZagPrint {
    public 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 fromUp = false;
        while(aR != endR + 1){
            printLevel(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;
        }
        System.out.println();
    }

    private void printLevel(int[][] matrix, int aR, int aC, int bR, int bC, boolean fromUp) {
        if (fromUp) {
            while (aC != bC - 1) {
                System.out.print(matrix[aR++][aC--] + " ");
            }
        } else {
            while (bC != aC + 1) {
                System.out.print(matrix[bR--][bC++] + " ");
            }
        }
    }

    @Test
    public void test(){
        int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        printMatrixZigZag(matrix);
    }
}