您的位置:首页 > 其它

螺旋输出二维矩阵

2012-08-12 17:24 274 查看
1. 题目:顺时针螺旋输出二维矩阵。

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

3. 代码:

#include<iostream>
#include<cassert>

using namespace std;

#define ROW 5
#define COL 4

//使用参数k可以巧妙地计算每一个元素的位置
void print_spiral(int mat[][COL], int m, int n, int k) {
if (m <= 0 || n <= 0)
return;
if (m == 1) {
for (int j = 0; j < n; j++)
cout << mat[k][k+j] << " ";
return;
}
if (n == 1) {
for (int i = 0; i < m; i++)
cout << mat[k+i][k] << " ";
return;
}
// print from top left
for (int j = 0; j < n - 1; j++)
cout << mat[k][k+j] << " ";
// print from top right
for (int i = 0; i < m - 1; i++)
cout << mat[k+i][k+n-1] << " ";
// print from bottom right
for (int j = 0; j < n - 1; j++)
cout << mat[k+m-1][k+n-1-j] << " ";
// print from bottom left
for (int i = 0; i < m - 1; i++)
cout << mat[k+m-1-i][k] << " ";

//尾递归可以改成循环的形式
//每次剥去最外面的一层数字,下一次m-2,n-2,k+1
print_spiral(mat, m-2, n-2, k+1);
}

void print_spiral_helper(int mat[][COL], int m, int n) {
print_spiral(mat, m, n, 0);
}

int main()
{
int matrix[ROW][COL]={1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16,
17,18,19,20};
print_spiral_helper(matrix,ROW,COL);
}


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

5. 参考文章:

http://www.leetcode.com/2010/05/printing-matrix-in-spiral-order.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: