zoukankan      html  css  js  c++  java
  • 顺时针打印矩阵

    一,问题描述

    给定一个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

  • 相关阅读:
    推荐19个很有用的 JavaScript 库
    李开复:我对年轻人是分享经验 不是要当导师
    DotNET企业架构应用实践数据库表记录的唯一性设计的设计兼议主键设定原则
    cookies,session,viewstate浅析
    不是HR,Leader你到底需要招什么样的程序员(变形金刚?超人?可能吗!)
    IBatis.Net学习笔记系列文章
    学习mvc的一些资料
    数据库日常维护常用的脚本部分收录
    设定Grid行的颜色
    被WSS3.0耍了一把
  • 原文地址:https://www.cnblogs.com/hapjin/p/5559487.html
Copyright © 2011-2022 走看看