题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
分析;
完整代码:
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
//获取矩阵的行列数
int rows = matrix.size();
int cols = matrix[0].size();
//定义临时vector
vector<int> array;
//检查输入的合法性
if(matrix.empty()|| rows<=0 || cols<=0)
return array;
//定义起始点
int start = 0;
//结束循环的条件:当矩阵打印完毕时,起始点的坐标会超出行列长的的一半
while(rows > start *2 && cols > start *2)
{
/*******输出顺时针圈********/
//计算圈的右下角坐标
int EndX = cols - start -1;
int EndY = rows - start -1;
//从左到右,打印一行
//从左上角的起点开始
for(int i = start; i<=EndX; ++i)
{
//其特点是行不变,列在变
int number = matrix[start][i];
array.push_back(number);
}
//从上到下,打印一列
//判断起点在边界内
if(start < EndY)
{
//起点的行坐标往下走一步
for(int i = start + 1; i<=EndY; ++i)
{
//其特点是行在变,而列不变
int number = matrix[i][EndX];
array.push_back(number);
}
}
//从右到左,打印一行
//判断此时的起点在边界内
if(start < EndX && start < EndY)
{
//起点的列坐标往左走一步
for(int i = EndX-1; i>= start; --i)
{
//其特点是行不变而列在变
int number = matrix[EndY][i];
array.push_back(number);
}
}
//从下到上,打印一列
if(start < EndX && start < EndY-1)
{
//起点的行坐标往上走一步,终止点往下走一步
for(int i = EndY-1; i>=start+1; --i)
{
int number = matrix[i][start];
array.push_back(number);
}
}
//起始点往右下移动一位
++start;
}
//返回打印出来的数值
return array;
}
};