剑指Offer算法实现之二十:顺时打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针顺序依次打印出每一个数字。例如:如果输入如下矩阵:
1      2    3     4
5      6    7     8
9    10  11  12
13  14  15  16

则依次打印:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10

思路:

① 递归打印,每次打印一圈
② 递归终止条件:设待打印圈的左上角坐标为(x,x),为:2*x >= columns || 2*x>= rows。columns和rows为矩阵的列与行数。推导思路:除最内圈(当为不完整的圈时),每圈将矩阵缩小两行两列。
③ 边界情况:若递归非终止,首先打印最上行。若当前圈至少两列,打印右列。若当前圈至少两列两行,打印下行。若当前圈至少三行两列,打印左列

编译环境:ArchLinux+Clang3.3,C++11

实现一:

#include <iostream>
using namespace std;
/** 顺时针打印矩阵 **/
void printMatrix(int **a, int columns, int rows, int start = 0)
{
    if ( !a || columns<1 || rows<1 || start<0 ) return;
    if ( 2*start >= columns || 2*start >= rows ) return;
    int stopX = columns - 1 - start;
    int stopY = rows - 1 - start;
    
    for (int i = start; i <= stopX; i++) // 最上行
        cout << a[start][i] << ' ';
    if (start < stopX) { // 最右列
        for (int i = start+1; i <= stopY; i++) {
            cout << a[i][stopX] << ' ';
        }
    }
    if (start < stopX && start < stopY) { // 最下列
        for (int i = stopX-1; i >= start; i--) {
            cout << a[stopY][i] << ' ';
        }
    }
    if (start < stopX && start < stopY-1) { // 最左列
        for (int i = stopY-1; i >= start+1; i--) {
            cout << a[i][start] << ' ';
        }
    }
    printMatrix(a, columns, rows, start+1); // 打印邻接内圈
}

int main()
{
    int a[][4] = {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,16},
        };
    int **b = new int*[4];
    for (int i = 0; i < 4; i++) {
        b[i] = a[i];
    }
    printMatrix(b, 4, 4);
}


你可能感兴趣的:(剑指Offer算法实现之二十:顺时打印矩阵)