您的位置:首页 > Web前端

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

2015-11-14 12:13 344 查看
题目:

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

比如
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


思路:

顺时针打印实际上是每次循环打印一圈矩阵的外层,然后圆圈不断向内缩小,每次打印的起始点实际为(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] << " ";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: