1. 程式人生 > >轉圈打印矩陣

轉圈打印矩陣

pan lse order static 空間 起點 === 設置 public

【題目】 給定一個整型矩陣matrix,請按照轉圈的方式打印它。
例如:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
打印結果為:1,2,3,4,8,12,16,15,14,13,9, 5,6,7,11, 10 【要求】 額外空間復雜度為O(1)。
public class PrintMatrixSpiralOrder {
public static void main(String[] args) {
int arr[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
print(arr);
System.out.println("=================================");
rotate(arr);
}

public static void rotate(int matrix[][]){
int tr = 0; //起點的行坐標。
int tc = 0; // 起點的縱坐標。
int dr = matrix.length-1; //右下角元素的行坐標。
int dc = matrix[0].length-1; //右下角元素的縱坐標。
while (tr<=dr){ //判斷跳出循環的條件,相當於層。用tc和dc易可。
rotatePrint(matrix,tr++,tc++,dr--,dc--);
}
}
//每一層的打印方法
//分三種情況:
//1,只有一行
//2,只有一列
//3,其序情況。
public static void rotatePrint(int martix[][],int tr,int tc, int dr,int dc){
if(tr==dr){ //第一種情況。
for (int i=tc;i<=dc;i++){
System.out.print(martix[tr][i]+" ");
}
}else if(tc==dc){ //第二種情況
for (int i=tr;i<=dr;i++){
System.out.print(martix[i][tc]+" ");
}
}else { //設置一個變量,從起點,轉圈旋轉到起點。
int curR = tr;
int curC = tc;
while (curC!=dc){ //四個where為轉圈打印。
System.out.print(martix[tr][curC]+" ");
curC++;
}
while (curR!=dr){
System.out.print(martix[curR][dc]+" ");
curR++;
}
while (curC!=tc){
System.out.print(martix[dr][curC]+" ");
curC--;
}
while (curR!=tr){
System.out.print(martix[curR][tc]+" ");
curR--;
}
}
}
public static void print(int arr[][]){
for (int i =0;i<arr.length;i++){
for (int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
總結:按層打印,確定邊界條件。

轉圈打印矩陣