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