• 顺时针打印矩阵


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

    例如:如果输入如下矩阵:
    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]<<"  ";
        }
    }
  • 相关阅读:
    DO语句与SELECT语句,HANDLER语句
    Mysql 删除语句
    Mysql 调用存储过程的两种方式
    Mysql tablespace
    忘记Mysql登录密码
    Mysql 全文索引
    Mysql手册—SQLStatementSyntax
    Mysql手册—基本规范与数据类型
    Mysql常用函数列举
    真三 典伟的帅气
  • 原文地址:https://www.cnblogs.com/menghuizuotian/p/3779802.html
Copyright © 2020-2023  润新知