順時針打印矩陣


一,問題描述

給定一個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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM