循環打印矩陣(算法)

題目:給定一個矩陣matrix,從第一個元素開始循環打印矩陣,例如:

在這裏插入圖片描述
打印結果爲:1,5,6,8,3,8,3,7,6,1,6,6,2,7,2,8。

算法思想:循環打印矩陣可以分而治之,即先打印最外圍的一圈,依次往裏推則可解決該問題。

打印最外圍方法如下:定義一個動點P(curR,curC),初始時curR=row1,curC=col1,①curC遞增(終止條件爲curC=col2),②curR遞增(終止條件爲curR=row2),③curC遞減(終止條件爲curC=col1),④curR遞減(終止條件爲curR=row1)。這樣矩陣外圍就按照條件打印出來了,然後將點A,B分別往中心移動一次,即row1++,col1++;row2–,col2–,重複上述四個步驟即可。

算法代碼如下:

package test_class_03;

public class PrintMatrixSpiralOrder {
	
	public static void SpiralOrderPrint(int [][]Matrix){
		int row1=0;
		int col1=0;
		int row2=Matrix.length-1;
		int col2=Matrix[0].length-1;
		while(row1 <= row2 && col1 <= col2){
			printSqure(Matrix,row1++,col1++,row2--,col2--);
		}
		System.out.println();
	}
	
	public static void printSqure(int [][]Matrix,int row1,int col1,int row2,int col2){
		int curR=row1;
		int curC=col1;
		if(row1==row2){
			while(curC!=col2+1){
				System.out.print(Matrix[curR][curC++]+" ");
			}
		}else if(col1==col2){
			while(curR!=row2+1){
				System.out.print(Matrix[curR++][curC]+" ");
			}
		}else{
			while(curC!=col2){
				System.out.print(Matrix[curR][curC++]+" ");
			}
			while(curR!=row2){
				System.out.print(Matrix[curR++][curC]+" ");
			}
			while(curC!=col1){
				System.out.print(Matrix[curR][curC--]+" ");
			}
			while(curR!=row1){
				System.out.print(Matrix[curR--][curC]+" ");
			}
		}
	}
	
	public static void main(String[] args) {
		int [][]m={{4,5,6,8},{6,2,7,3},{6,8,2,8},{1,6,7,3}};
		SpiralOrderPrint(m);
	}
}

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