一,問題描述
給定一個N x N 的矩陣(方陣),按照從外向里的以順時針方向依次打印矩陣中的每個元素。
比如:一個 3X3的矩陣如下:打印順序為:1 2 3 6 9 8 7 4
{1,2,3}
{4,5,6}
{7,8,9}
打印方向如下:
二,算法思路
可以采用遞歸的方式來打印整個矩陣中的元素。
首先按順時針方向打印最外層的元素,然后再遞歸地打印更里層的元素。
對於N維方陣而言:每打印一圈之后,維數降低2。當N為奇數時,最終遞歸到 1x1矩陣。當N為偶數時,最終遞歸到N=0
因此,遞歸的基准條件:當N==0 時,直接返回。 N==1時,打印矩陣中唯一的那個元素,然后返回。
具體代碼如下:
1 private static void printArray(int[][] arr, int row, int column, int n){ 2 //base condition 3 if(n == 0) 4 return; 5 if(n == 1){ 6 print(arr[row][column]); 7 return; 8 } 9 10 printElementClockWise(arr, row, column);//clockwise print element 11 printArray(arr, row + 1, column - 1, n - 2);//recursively call 12 }
①第3行和第5行的if表示的是遞歸的基准條件
②第10行,是順時針打印矩陣中的元素。注意:它在遞歸調用之前執行,這說明:打印順序是從外到內的。(對遞歸的理解)說白了,就是先打印了外層的元素,再遞歸調用打印內層元素。
③第10行執行遞歸調用。因為打印的是更里層的元素,故待打印的元素的位置:行數增加1,列數減少1
每打印一圈之后,數組的維數降低2
三,完整代碼實現
1 public class PrintArray { 2 3 public static void printArray(int[][] arr){ 4 if(arr == null || arr.length == 0) 5 return; 6 printArray(arr, 0, arr.length - 1, arr.length); 7 } 8 9 private static void printArray(int[][] arr, int row, int column, int n){ 10 //base condition 11 if(n == 0) 12 return; 13 if(n == 1){ 14 print(arr[row][column]); 15 return; 16 } 17 18 printElementClockWise(arr, row, column);//clockwise print element 19 printArray(arr, row + 1, column - 1, n - 2);//recursively call 20 } 21 22 /** 23 * 順時針由外到內打印數組 24 * @param arr 25 * @param row 26 * @param column 27 */ 28 private static void printElementClockWise(int[][] arr, int row, int column){ 29 for(int i = row; i <= column; i++) 30 print(arr[row][i]); 31 for(int i = row + 1; i <= column; i++) 32 print(arr[i][column]); 33 for(int i = column - 1; i >= row; i--) 34 print(arr[column][i]); 35 for(int i = column - 1; i > row; i--) 36 print(arr[i][row]); 37 } 38 39 private static void print(int i){ 40 System.out.print(i + " "); 41 } 42 43 //for test purpose 44 public static void main(String[] args) { 45 int[][] arr = { 46 {1,2,3}, 47 {4,5,6}, 48 {7,8,9} 49 }; 50 System.out.println("arr.length:" + arr.length); 51 printArray(arr); 52 System.out.println(); 53 int[][] arr2 = { 54 {1,2,3,10}, 55 {4,5,6,11}, 56 {7,8,9,12}, 57 {13,14,15,16} 58 }; 59 printArray(arr2); 60 61 int[][] arr3 = {}; 62 System.out.println(arr3.length); 63 printArray(arr3); 64 printArray(null); 65 } 66 }
擴展:根據上面的思路,我們也可以構造一個蛇形矩陣。
1 private void print(int[][] arr, int row, int col){ 2 for(int i = row; i <= col; i++) 3 arr[row][i] = count++; 4 // System.out.print(arr[row][i]); 5 for(int i = row+1; i <= col; i++) 6 arr[i][col] = count++; 7 // System.out.print(arr[i][col]); 8 for(int i = col-1; i >= row; i--) 9 arr[col][i] = count++; 10 // System.out.print(arr[col][i]); 11 for(int i = col-1; i > row; i--) 12 arr[i][row] = count++; 13 // System.out.print(arr[i][row]); 14 }
count是個靜態全局變量,初始值為1