顺时针打印矩阵

来源:互联网 发布:什么是好的域名 编辑:程序博客网 时间:2024/05/07 07:15

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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_s,c_s),右下角为(r_e,c_e)。分五种情况讨论:

  1. 当矩阵为空时,打印数组为空;

2. 如果矩阵只有一个数或者只剩一个元素遍历的时候,条件是r_s == r_e && c_s == c_e,将该元素打印即可;

3. 如果矩阵只有一行或者只剩一行遍历的时候,条件是r_s == r_e && c_s < c_e,打印该行既可;

4. 如果矩阵只有一列或者只剩一列遍历的时候,r_s < r_e && c_s == c_e,打印该列即可;

5. 如果有多行或者多列时,从(r_s,c_s)开始顺时针打印;打印完之后r_s++;c_s++;r_e--;c_e--;再从第二种情况判断;

源代码

 //顺时针打印矩阵
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
int m = matrix.size();//行数
if(m <= 0)
return result;
int n = matrix[0].size();//列数
if(n <= 0)
return result;
int r_s = 0 , c_s = 0 , r_e = m-1 , c_e = n-1;
int r,c;
while(r_s <= r_e && c_s <= c_e)
{
//表示该点是最后一个元素或者是惟一的一个元素
if(r_s == r_e && c_s == c_e)
{
result.push_back(matrix[r_s][c_s]);
return result;
}
//只有一行
else if(r_s == r_e && c_s < c_e)
{
for(c = c_s ; c <= c_e ; c++)
result.push_back(matrix[r_s][c]);
return result;
}
//只有一列
else if(c_s == c_e && r_s < r_e)
{
for(r= r_s ; r <= r_e ; r++)
result.push_back(matrix[r][c_s]);
return result;
}
else
{
for(r = r_s , c = c_s ; c < c_e ; c++)
result.push_back(matrix[r][c]);
for(; r < r_e ; r++)
result.push_back(matrix[r][c]);
for( ; c > c_s ; c--)
result.push_back(matrix[r][c]);
for( ; r > r_s ; r--)
result.push_back(matrix[r][c]);
r_s++;
c_s++;
r_e--;
c_e--;
}
}
return result;
}

0 0
原创粉丝点击