剑指offer--顺时针打印矩阵

来源:互联网 发布:vmware fusion 知乎 编辑:程序博客网 时间:2024/05/29 02:37

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

#define ROW 4#define COL 4//一次打印一圈void PrintMatrixInCirclie(int **arr,int row,int col,int start){    int endX = col-1-start;    int endY = row-1-start;    //从左往右打印    for(int i=start;i<=endX;++i)    {        cout<<arr[start][i]<<" ";    }    if(start < endY)    {        //从上往下打印        for(int i=start+1;i<=endY;++i)        {            cout<<arr[i][endX]<<" ";        }    }    if(start<endX && start<endY)    {        //从右往左打印        for(int i=endX-1;i>=start;--i)        {            cout<<arr[endY][i]<<" ";        }    }    if(start<endX && start<endY-1)    {        //从下往上打印        for(int i=endY-1;i>=start+1;--i)        {            cout<<arr[i][start]<<" ";        }    }}//从外向内顺时针打印矩阵void PrintMatrixClockwisely(int **arr,int rows,int cols){    if(arr==NULL || rows<=0 || cols<=0)        return;    int start = 0;    while(rows>start*2 && cols>=start*2)    {        PrintMatrixInCirclie(arr,rows,cols,start);        ++start;    }}//从内向外顺时针打印矩阵void PrintMatrix(int **arr,int rows,int cols){    if(arr==NULL || rows<=0 || cols<=0)        return;    int start = ROW/2;    while(start>=0 && cols>=0)    {        PrintMatrixInCirclie(arr,rows,cols,start);        --start;    }}int main(){    int count = 1;    int **arr = new int *[ROW];    for(int i=0;i<ROW;i++)    {        arr[i] = new int[COL];        for(int j=0;j<COL;j++)        {            arr[i][j] = count++;        }    }    cout<<"从外向内顺时针打印矩阵:"<<endl;    PrintMatrixClockwisely(arr,ROW,COL);    cout<<endl;    cout<<"从内向外顺时针打印矩阵:"<<endl;    PrintMatrix(arr,ROW,COL);}

这里写图片描述