聯繫螺旋矩陣那一道題。解題思路都是先畫圖,然後發現螺旋相當於一圈一圈的打印,每一圈的起點都是(i,i)。
public class PrintMatrixInCircle {
//每一圈的起點都是(i,i)
//對於一個m*n的矩陣,最後一圈的起點座標爲min((m-1)/2,(n-1)/2),這是最後一個start的位置。因此m-1>=2*start,n-1>=2*start
//所以當row>startX*2&&column>startY*2時循環
public static void printMatrixClockWisely(int[][]numbers){
if(numbers==null)
return;
int rows=numbers.length;
int columns=numbers[0].length;
int start=0;
while(rows>start*2&&columns>start*2){
PrintMatrixInCircle(numbers,start);
start++;
}
}
/**m*n矩陣,第i圈四個頂點分別是(i.i) (i,n-i-1) (m-i-1,i) (m-i-1,n-i-1)座標系橫軸爲row,縱軸爲column
* @param numbers 數組
* @param start 每一圈開始的位置
*/
private static void PrintMatrixInCircle(int[][] numbers, int start) {
int rows=numbers.length;
int columns=numbers[0].length;
int endR=rows-start-1;
int endC=columns-start-1;
//從左到右打印一行
for(int i=start;i<=endC;i++){
System.out.println(numbers[start][i]);
}
//從上到下打印一列,說明至少兩行
if(start<endR){
for(int i=start+1;i<=endR;i++){
System.out.println(numbers[i][endC]);
}
}
//從右到左打印一行,說明至少兩行兩列
if(start<endR&&start<endC){
for(int i=endC-1;i>=start;i--){
System.out.println(numbers[endR][i]);
}
}
//從下到上打印一列,說明至少三行兩列
if(start<endR-1&&start<endC){
for(int i=endR-1;i>=start+1;i--){
System.out.println(numbers[i][start]);
}
}
}
public static void main(String[] args) {
int[][]numbers=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
printMatrixClockWisely(numbers);
}
}