顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.

注意:分析每一步打印的前提条件。第一步总是需要的,因为打印一圈至少有一步。如果只有一行,那就不用第二步了。也就是需要第二步的前提条件是终止行号大于起始行号。需要第三步打印的前提条件是圈内至少有两行两列,也就是说除了要求终止行号大于外,还要求终止列号大于起止列号。同理,需要打印第四步的前提条件是至少有三行两列,因此要求终止行号比起始行号至少大2,同时终止列号大于起止列号。

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class  Solution
{
public :
    
void  PrintCircle(vector<vector< int > > &matrixmatrix,  int  clos,  int  rows,  int  start, vector< int > &res)
    {
        
int  endX = clos -  1  - start;
        
int  endY = rows -  1  - start;
//从左到右打印第一行
        
for  ( int  i = start; i <= endX; i++)
        {
            
int  number = matrixmatrix[start][i];
            res.push_back(number);
        }
//从上到下打印一列
        
if  (start < endY)
        {
            
for  ( int  i = start +  1 ; i <= endY; ++i)
            {
                
int  number = matrixmatrix[i][endX];
                res.push_back(number);
            }
        }
//从右到左打印一行
        
if  (start < endX && start < endY)
        {
            
for  ( int  i = endX -  1 ; i >= start; --i)
            {
                
int  number = matrixmatrix[endY][i];
                res.push_back(number);
            }
        }
//从下到上打印一列
        
if  (start < endX && start < endY -  1 )
        {
            
for  ( int  i = endY -  1 ; i >= start +  1 ; --i)
            {
                
int  number = matrixmatrix[i][start];
                res.push_back(number);
            }
        }
    }
    vector<
int > printMatrix(vector<vector< int > > matrix)
    {
        
int  rows = matrix.size();//行数
        
int  clos = matrix[ 0 ].size();//列数
        vector<
int > res;
        
if  (matrix.size() ==  0  || clos ==  0  || rows ==  0 return  res;
        
int  start =  0 ;
        
while  (clos > start *  2  && rows > start *  2 )//让循环继续的条件
        {
            PrintCircle(matrix, clos, rows, start, res);
            ++start;
        }
        
return  res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值