顺时针打印矩阵

题目:输入一个矩阵,按照从外到里以顺时针顺序依次打印每一个数字

例如:如果输入如下矩阵:
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。

分析:突破点就是先要画图,如下图

image

每次打印一个圈,接下来下一圈的左上角坐标点为起点再打印。

其中需要考虑在打印每一圈的时候一些情况:

image

上面是打印每一圈的时候,要考虑是否需要四周全部要打印呢?具体在代码里面体现了。

void printMatrixClockwisely(int **numbers,int rows,int columns )
{
    if(numbers==NULL||rows<=0||columns<=0)
        return ;

    //打印的终止条件,本题的核心,每个圆圈的起点就是左上角的点,所以主要是对这个点进行判断
    //能循环打印的条件是最里面一圈的起点(也就是这个圈左上角的点)*<rows&&<columns
    int start=0;
    while((rows>2*start)&&(columns>2*start))
    {
       //每次while打印一个圈
        printACircle(numbers,rows,columns,start);
        start++;   //start++ 就是进行下一个圆圈
    }
}

void printACircle(int **numbers,int rows,int columns,int start)
{
    int endX=columns-1-start;
    int endY=rows-1-start;
    
    //先遍历上行
    if(start<=endX)
    {
        for (int i=start;i<=endX;i++)
            cout<<numbers[start][i]<<"  ";
    }
        
    //遍历右列
    if (start<endY)
    {
        for(int i=start;i<=endY;i++)
            cout<<numbers[i][endX]<<"  ";
    }   
    
    //遍历下行
    if (start<endX&&start<endY)
    {
        for(int i=endX-1;i>=start;i--)
            cout<<numbers[endY][i]<<"  ";
    }
        
    //遍历左列
    if (start+1<endY&&start<endX)
    {
        for(int i=endY-1;i>=start-1;i--)
            cout<<numbers[i][start]<<"  ";
    }
}
posted @ 2014-06-10 13:29  menghuizuotian  阅读(341)  评论(0编辑  收藏  举报