题目:给定一个矩阵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);
}
}