螺旋输出二维矩阵

1. 题目:顺时针螺旋输出二维矩阵。

2. 分析:螺旋输出二维矩阵,每次剥除最外层的数据,下次再输出里面的数据。很容易想到,这个可以用递归实现,在输出一圈时,输出顺序为:topLeft-->topRight-->bottomRight-->bottomLeft-->topLeft。在递归程序中怎样计算每一个元素的下标这个是关键。

3. 代码:

 1 #include<iostream>
 2 #include<cassert>
 3 
 4 using namespace std;
 5 
 6 #define ROW 5
 7 #define COL 4
 8 
 9 //使用参数k可以巧妙地计算每一个元素的位置
10 void print_spiral(int mat[][COL], int m, int n, int k) { 
11     if (m <= 0 || n <= 0) 
12         return; 
13     if (m == 1) { 
14         for (int j = 0; j < n; j++) 
15             cout << mat[k][k+j] << " "; 
16         return; 
17     } 
18     if (n == 1) { 
19         for (int i = 0; i < m; i++) 
20             cout << mat[k+i][k] << " "; 
21         return; 
22     } 
23     // print from top left 
24     for (int j = 0; j < n - 1; j++) 
25         cout << mat[k][k+j] << " "; 
26     // print from top right 
27     for (int i = 0; i < m - 1; i++) 
28         cout << mat[k+i][k+n-1] << " "; 
29     // print from bottom right 
30     for (int j = 0; j < n - 1; j++) 
31         cout << mat[k+m-1][k+n-1-j] << " "; 
32     // print from bottom left 
33     for (int i = 0; i < m - 1; i++) 
34         cout << mat[k+m-1-i][k] << " "; 
35     
36     //尾递归可以改成循环的形式
37     //每次剥去最外面的一层数字,下一次m-2,n-2,k+1
38     print_spiral(mat, m-2, n-2, k+1); 
39 } 
40 
41 void print_spiral_helper(int mat[][COL], int m, int n) { 
42     print_spiral(mat, m, n, 0); 
43 }
44 
45 int main()
46 {
47     int matrix[ROW][COL]={1,2,3,4,
48                           5,6,7,8,
49                           9,10,11,12,
50                           13,14,15,16,
51                           17,18,19,20};
52     print_spiral_helper(matrix,ROW,COL);
53 }

4. 分析:这里巧妙的使用了一个参数k,使得很容易计算出数据的下标;这个尾递归程序可以很容易地改成迭代程序。注意递归的终止条件和矩阵下标的计算方法。在计算矩阵下标时巧妙地使用k。

5. 参考文章:

http://www.leetcode.com/2010/05/printing-matrix-in-spiral-order.html

转载于:https://www.cnblogs.com/ZJUKasuosuo/archive/2012/08/12/2635255.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值