一,问题描述
给定一个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 element11 printArray(arr, row + 1, column - 1, n - 2);//recursively call12 }
①第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 condition11 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 element19 printArray(arr, row + 1, column - 1, n - 2);//recursively call20 }21 22 /**23 * 顺时针由外到内打印数组24 * @param arr25 * @param row26 * @param column27 */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 purpose44 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
本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/5559487.html,如需转载请自行联系原作者