剑指Offer-20-顺时针打印矩阵

来源:互联网 发布:音频频谱分析软件 编辑:程序博客网 时间:2024/05/19 06:38

题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。

比如1   2  3  4 5   6  7  89  10 11 1213 14 15 16打印结果为 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

思路:
顺时针打印实际上是每次循环打印一圈矩阵的外层,然后圆圈不断向内缩小,每次打印的起始点实际为(i,i)i=0,1,2,…。
打印起始点的终止条件为

2*i<rows && 2*i < cols

圆圈的打印规律为
1.从左向右打印
2.从上到下打印
3.从右到左打印
4.从下到上打印

每一步打印的前提条件:
1.总是需要,因为打印一圈至少有一步。
2.如果只有一行,那么不需要第二步,所以第二步的前提条件是终止行号大于起始行号。
3.第三步的前提条件是圈内至少有两行两列,即,除了第二步的前提条件以外,还有终止列号大于起始列号。
4.第四步的前提条件是圈内至少有3行两列,即,除了第三步的前提条件以外,还要终止行号大于起始行号+1

#include <iostream>using namespace std;void printMatrix(int** matrix, int rows, int cols) {    if (rows <= 0 || cols <= 0)        return;    int start = 0;    //判断打印起始点循环的终止条件    while (start * 2 < rows && start * 2 < cols) {        //以(i,i)为起始点,打印一圈数值        print(matrix, rows, cols, start);        start++;    }}//以(start,start)为起点,顺时针打印一圈数值void print(int** matrix, int rows, int cols, int start) {    //终止列号    int endX = cols - start - 1;    //终止行号    int endY = rows - start - 1;    //从左到右打印一行    for (int i = start; i <= endX; i++)        cout << matrix[start][i] << " ";    //从上到下打印一列    if (endY > start) {        for (int i = start + 1; i <= endY; i++)            cout << matrix[i][endX] << " ";    }    //从右到左打印一行    if (endY > start && endX > start) {        for (int i = endX - 1; i >= start; i--)            cout << matrix[endY][i] << "";    }    //从下到上打印一列    if (endY - 1 > start && endX > start) {        for (int i = endY - 1; i >= start + 1; i--)            cout << matrix[i][start] << " ";    }}
0 0