zoukankan      html  css  js  c++  java
  • 顺时针打印矩阵

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

    例如:如果输入如下矩阵:

    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。

    思路:

    1.首先判断一次顺时针打印是否符合条件:由于每一次打印的起始坐标为(start,start),start从0开始,即(0,0),打印一次加1,经过推算得出顺时针打印条件为(列数>2*start && 行数>2*start)

    2.然后开始一次顺时针打印,分4个步骤组成:(除了第一个步骤,每个步骤都不是必须进行的,需要满足一定条件)

    (1). 从左到右打印,只要符合顺时针打印的条件就必须进行第一步

    (2). 从上到下打印,条件是列数至少含有2列

    (3).从右向左打印,条件是至少包含两行两列

      (4). 从下到上打印,条件是至少包含两行三列

    实现代码如下:

    #include<iostream>
    using namespace std;
    //执行一次顺时针打印的函数,需要四个步骤,但每一步都不是必须的,有可能只需要几步
    void subprint(int **data,int rows,int columns,int start)
    {
        int endx=columns-1-start;
        int endy=rows-1-start;
        //第一步,从左到右打印,这一步必须执行
        for(int i=start;i<=endx;i++)
        {
            int number=data[start][i];
            cout<<"    "<<number;
        }
        //第二步,从上到下打印,条件是至少包含两行
        for(int i=start+1;i<=endy;i++)
        {
            cout<<"    "<<data[i][endx];
        }
        //第三步,从右向左打印,条件是至少包含两行两列
        for(int i=endx-1;i>=start;--i)
        {
            cout<<"    "<<data[endy][i];
        }
        //第四步,从下到上打印,条件是至少包含两行三列
        for(int i=endy-1;i>=start+1;--i)
        {
            cout<<"    "<<data[i][start];
        }
    }
    //函数实现
    void print(int **data,int rows,int columns)
    {
        try
        {
            if(data==NULL||rows<=0||columns<=0)
                throw new exception("参数错误!");
            int start=0;
            //一次顺时针打印的条件是rows>2*start && columns>2*start
            while(rows>2*start && columns>2*start)
            {
                subprint(data,rows,columns,start);
                start++;
            }
        }
        catch(exception e)
        {
            cerr<<e.what()<<endl;
        }
    }

    这里注意一下我定义的函数的形参为二级指针,而实参不可以直接是二维数组,必须初始化为指针数组(实际是一个数组,数组中每一个元素是一个指针)

    如果非要二维数组作为实参的话,形参必须为指向数组的指针(数组指针)

    测试代码及运行结果:

    int main()
    {
        int data[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
        int *p[4];//指针数组,实际是一个数组,数组中每一个元素是一个指针
        //给指针数组赋值
        for(int i=0;i<4;i++)
        {
            p[i]=data[i];
        }
        print(p,4,4);
        return 0;
    }

    简单解释一下指针数组和数组指针的区别:

    由于指针数组中的每一个元素都为一个指针,而data[i]代表第i个分数组的首地址,故可以p[i]=data[i]可以完成指针数组的初始化;

    而数组指针代表的是指向一个数组的指针,它的初始化如下(和本例无关)

        //数组指针,实际是指向数组的指针,是一个指针
        int (*p2)[4];//p2是指向 有4个元素的数组 的指针
        //数组指针的初始化
        p2=data;//data为0行分数组的地址,将他赋值给p2指针,并且data==&data[0]成立,将&data[0]赋值给p2也是一样的
        p2=&data[0];
    
    
    
  • 相关阅读:
    linux , nginx: 封禁IP的办法【转】
    分布式之消息队列复习精讲【转】
    RocketMQ 简单梳理 及 集群部署笔记【转】
    ls列出排除的文件
    patch的用法【转】
    python3.6安装 zipimport.ZipImportError: can't decompress data; zlib not available【转】
    为什么用ls和du显示出来的文件大小有差别?【转】
    Python多进程和多线程是鸡肋嘛?【转】
    nginx针对某个url限制ip访问,常用于后台访问限制【转】
    windows服务器卸载补丁命令【转】
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4564566.html
Copyright © 2011-2022 走看看