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)。
 * @author Administrator
 *
 */
public class Code07_ZigZagPrintMatrix {

	public static void printZigZagMatrix(int[][] matrix) {
		int tR = 0;
		int tC = 0;
		int dR = 0;
		int dC = 0;
		int endR = matrix.length - 1;
		int endC = matrix[0].length - 1;
		boolean toDown = false;
		while(tR != endR + 1) {
			printLevel(matrix, tR, tC, dR, dC, toDown);
			tR = tC == endC ? tR + 1 : tR; // 列印完一行後行數加1
			tC = tC == endC ? tC : tC + 1; // 不到最後一列,列數加1
			dC = dR == endR ? dC + 1 : dC;
			dR = dR == endR ? dR : dR + 1;
			toDown = !toDown;
		}
	}
	
	// 列印右上角點 與 左下角點 連成的直線
	public static void printLevel(int[][] matrix, int tR, int tC, int dR, int dC, boolean toDown) {
		if(toDown) {
			while(tR != dR + 1) {
				System.out.print(matrix[tR++][tC--] + " ");
			}
		} else {
			while(dR != tR - 1) {
				System.out.print(matrix[dR--][dC++] + " ");
			}
		}
	}
	
	public static void main(String[] args) {
		int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
		printZigZagMatrix(matrix);
	}
}