顺时针打印矩阵
题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:
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.
思路
对于行列分别为 r c 的矩阵
每次打印一圈
这一圈的起点是 (n, n), n 从0开始
用while循环包裹这个一圈,while循环的条件是:(r>2n, c>2n)
例如,要打印第二圈的话,n=1,矩阵必须满足,r>2 && c>2
每一圈打印的时候要注意停止标准!
特别注意:
- 一圈只有1个元素
- 一圈只有一行
- 一圈只有一列
实现
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int rows = matrix.size();
int columns = matrix.front().size();
vector<int> out;
int stR = 0, stC = 0;
while(rows>stR*2 && columns>stC*2)
{
int r = stR, mr = stR;
int c = stC, mc = stC;
out.push_back(matrix[r][c]);
while((++c)<(columns-stC))//右
{
out.push_back(matrix[r][c]);
mc = c;
}
c = mc;
while((++r)<(rows-stR))//下
{
out.push_back(matrix[r][c]);
mr = r;
}
r = mr;
while(mr>stR && ((--c)>=stC))//左
{
out.push_back(matrix[r][c]);
}
++c;
while(mc>stC && --r>stR)//上
{
out.push_back(matrix[r][c]);
}
++stR;
++stC;
}
return out;
}
};
//测试用例
#include <iostream>
#include <vector>
using namespace std;
void testClockWiseMtxPrint(int rows, int cols)
{
cout << "start mtx generate and clock-wise print:" << endl;
vector<vector<int>> mtx;
int row = rows, col = cols;
int k = 0;
for (int i = 0; i < row; ++i)
{
vector<int> tmtx;
for (int j = 0; j < col; ++j)
tmtx.push_back(k++);
mtx.push_back(tmtx);
}
cout << "MTX:" << endl;
for (auto v : mtx)
{
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
}
cout << "clock-wise MTX elements:" << endl;
vector<int> numList = Solution().printMatrix(mtx);
for (auto e : numList)
{
cout << e << " ";
}
cout << endl;
cout << "---End-----" << endl;
}
void main()
{
testClockWiseMtxPrint(1, 1);
testClockWiseMtxPrint(1, 5);
testClockWiseMtxPrint(4, 1);
testClockWiseMtxPrint(5, 4);
system("pause");
}