从外向里顺时针打印矩阵
比如一个矩阵为:1 2 3 4 那么输出结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
5 6 7 8
9 10 11 12
13 14 15 16
把打印矩阵抽象为每次打印一个顺时针圈,第一圈起始点为(0,0),第二圈起始点为(1,1),同理……
对于一个4*4的矩阵,当row>2*start&&cloumn>2*start时,所有数已经打印完毕。4*4最后一个圈的起始点为(1,1)满足循环条件。
对于一个5*5的矩阵,最后一个圈的起始点为(2,2)也满足循环条件。
打印一个圈的中止点即右下角的点为(row-start-1,cloumn-start-1);
当一个圈中只有一行时,只能打印从左往右的一行。
当一个圈中只有一列时,即有多行endx>start,只能进行两步,显示打印从左往右的一行,再打印从上往下的一列。
当一个圈中endx>start,endy>start,行数大于起始点时,即大于1行并且有多列时,可以走三步,显示打印从左往右的一行,再打印从上往下的一列,再打印从右往左的一行。
当一个圈中row>start+1,endy>start,行数大于2行时,可以走四步。显示打印从左往右的一行,再打印从上往下的一列,再打印从右往左的一行,在打印从下往上的一列。
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
int column=matrix[0].size(); //列
int row=matrix.size(); //行
int start=0; //刚开始从点(0,0)开始打印数字
//cout<<column<<" "<<row<<endl;
if(column==0||row==0)
return result;
while(row>2*start&&column>2*start)
{
int endx=row-start-1; //中止行号
int endy=column-start-1; //中止列号
//从左往右打印一行
for(int i=start;i<=endy;i++)
{
result.push_back(matrix[start][i]);
}
//从上往下打印一列
if(endx>start)
{
for(int i=start+1;i<=endx;i++)
{
result.push_back(matrix[i][endy]);
}
}
//从右往左打印一行
if(endy>start&&endx>start)
{
for(int i=endy-1;i>=start;i--)
{
result.push_back(matrix[endx][i]);
}
}
//从下往上打印一列
if(endx>=start+1&&endy>start)
{
for(int i=endx-1;i>start;i--)
{
result.push_back(matrix[i][start]);
}
}
start++;
}
return result;
}