顺时针打印矩阵

来源:互联网 发布:syslog日志服务器软件 编辑:程序博客网 时间:2024/05/20 08:02

前言

最近在刷剑指offer,碰到一道题如下:

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

剑指offer里的解法比较难懂,但看了牛客网有人对这题的解法我觉得很棒,特此在这里分享一下。


基本思想

定义四个变量分别对应左上,右上,左下,右下,根据这四个变量顺时针打印一圈,接着四个变量分别向对角缩进一个单位,继续打印,依次循环。如下图所示。

这里写图片描述


代码与测试

#include <iostream>#include <vector>using namespace std;vector<int> printMatrix(vector<vector<int>> matrix){    int row=matrix.size();    int col=matrix[0].size();    vector<int> res;    if(row==0||col==0) return res;    int left=0,top=0,right=col-1,bottom=row-1;    while(left<=right&&top<=bottom)    {        for(int i=left;i<=right;++i)            res.push_back(matrix[top][i]);        for(int i=top+1;i<=bottom;++i)            res.push_back(matrix[i][right]);        if(top!=bottom)//防止单行重复回文打印        for(int i=right-1;i>=left;i--)            res.push_back(matrix[bottom][i]);        if(left!=right)//防止单列重复回文打印        for(int i=bottom-1;i>top;--i)            res.push_back(matrix[i][left]);        left++,top++,right--,bottom--;    }    return res;} void Test(int colums,int rows){    cout<<"Test Begin: "<<colums<<" columns "<<rows<< " rows.\n";    if(colums < 1 || rows < 1)        return;    vector<vector<int>> matrix(rows,vector<int>(colums));    for(int j=0;j<rows;j++) {        for(int k=0;k<colums;k++) {            matrix[j][k]=j*colums+k+1;        }    }    vector<int> res;    res=printMatrix(matrix);    for(auto e:res)        cout<<e<<"\t";    cout<<endl;}int main(){     /*    1        */    Test(1, 1);    /*    1    2    3    4    */    Test(2, 2);    /*    1    2    3    4    5    6    7    8    9    10   11   12    13   14   15   16    */    Test(4, 4);    /*    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    */    Test(5, 5);    /*    1    2    3    4    5    */    Test(1, 5);    /*    1    2    3    4    5    6    7    8    9    10    */    Test(2, 5);    /*    1    2    3    4    5    6    7    8    9    10   11   12    13   14   15    */    Test(3, 5);    /*    1    2    3    4    5    6    7    8    9    10   11   12    13   14   15   16    17   18   19   20    */    Test(4, 5);    /*    1    2    3    4    5    */    Test(5, 1);    /*    1    2    3    4    5    6    7    8    9    10    */    Test(5, 2);    /*    1    2    3    4    5    6    7    8    9    10    11   12   13   14    15    */    Test(5, 3);    /*    1    2    3    4    5    6    7    8    9    10    11   12   13   14   15    16   17   18   19   20    */    Test(5, 4);    return 0;}

输出如下:

这里写图片描述