題目:給定一個矩陣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);
}
}