按“之”字形順序打印矩陣(算法)

題目:給定一個矩陣matrix,按照“之”字形的方式打印這個矩陣,例如:

在這裏插入圖片描述

打印結果爲:4,5,6,1,6,6,9,3,7。
要求額外空間複雜度爲O(1)。

算法思想:打印“之”字形數字

算法思想:根據上例容易觀察出之字形可以拆分成打印上圖直線上的數字,只需將打印方向改變就可以滿足題目要求。設置兩個初始點A和B,同時讓點A向右移動,點B向下移動,當A移動到右邊界時再繼續向下移動,當B移動到下邊界時再向右移動。A和B每移動一次就打印AB直接上的數字,退出條件爲row1>endR或col2>endC。

代碼如下:

package test_class_03;

public class ZigZagPrintMatrix {
	
	public static void printMatrixZigZag(int [][]m){
		//定義A,B兩個初始點以及終點End
		int row1=0;
		int col1=0;
		int row2=0;
		int col2=0;
		int endR=m.length-1;
		int endC=m[0].length-1;
		boolean fromup=false;
		while(row1!=endR+1){
			printLine(m,row1,col1,row2,col2,fromup);
			row1=col1==endC?row1+1:row1;      //A點剛開始移動時是行不變列 變,所以更新時應該將不變的行row1放在前面。
			col1=col1==endC?col1:col1+1;
			col2=row2==endR?col2+1:col2;      //B點剛開始移動時是行變列不變,所以更新時應該將不變的列col2放在前面。
			row2=row2==endR?row2:row2+1;
			fromup=!fromup;
		}
		System.out.println();
	}
	
	public static void printLine(int [][]m,int row1,int col1,int row2,int col2,boolean fromup){
		if(fromup){
			while(row1!=row2+1){
				System.out.print(m[row1++][col1--]+" ");
			}
		}else{
			while(row2!=row1-1){
				System.out.print(m[row2--][col2++] + " ");
			}
		}
	}
	public static void main(String[] args) {
		int [][]m={{4,5,6},{6,6,9},{1,3,7}};
		printMatrixZigZag(m);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章