博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
顺时针打印矩阵
阅读量:6894 次
发布时间:2019-06-27

本文共 3507 字,大约阅读时间需要 11 分钟。

一,问题描述

给定一个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,如需转载请自行联系原作者

你可能感兴趣的文章
安卓开发_深入理解广播机制
查看>>
技术大咖云集,GIAC 2017全球互联网架构大会圆满落幕
查看>>
推荐几款API文档集合工具
查看>>
代码照亮宝贝回家路
查看>>
OTL之Oracle开发总结《转》
查看>>
php取整函数ceil,floor,round,intval函数的区别
查看>>
安卓应用安全指南 4.2.2 创建/使用广播接收器 规则书
查看>>
Stratus Technologies与海得控制升级长期战略合作,助力中国工业自动化与工业物联网解决方案...
查看>>
新建的SQL Server账号无法使用跟踪功能
查看>>
远程线程注入引出的问题
查看>>
「镁客·请讲」NXROBO林天麟:我们分三步走,首先要做的就是打通机器人行业的产业链...
查看>>
这款创意相机,能让盲人更真实的感触身边世界
查看>>
hdu 1285 确定比赛名次(很典型的拓扑排序)
查看>>
学习iOS【3】数组、词典和集合
查看>>
8Python全栈之路系列之Django Cookie 与Sessi
查看>>
nginx反向代理配置
查看>>
DecimalFormat用法
查看>>
一致性哈希算法及其在分布式系统中的应用
查看>>
流程DEMO-出差申请单
查看>>
阿里巴巴与清华大学成立联合实验室,十问十答看人机交互未来时间表
查看>>