左神课堂---之字形打印矩阵------宏观调度思想

题目描述:

给定一个矩阵,要求按之字形打印出矩阵。

那么打印顺序为:1 2 5 9 6 3 4 7 10 11 8 12

基本思路:

定义两个点a,b。刚开始时a点和b点都在(0,0)位置,然后a点往右走,b点往下走,当a点碰到最右边时,a点往下走,当b点碰到最下边时,b点往右走。每走一次,就打印a点,b点对角线上的数字。然后在定义一个bool类型的变量来判断是从右上到左下打印还是从左下到右上打印。

代码如下:

#include<bits/stdc++.h>//基本思路:用一个点a和一个点b,刚开始a,b点都在(0,0)位置,然后a点往右走,b点往下走
using namespace std;//当a点碰到最右边的时候,a往下走。当b碰到最下边时,b往右走。a,b每走一次,打印a,b之间的数
int n;
int m;
int a[10000][10000];
bool p;//布尔类型变量,用来判断是从右上到左下打印还是从左下到右上打印
class heat
{
    //private:
    public:
        void shuru()//输入值
        {
            cin>>n>>m;
            p=true;
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                 cin>>a[i][j];
        }
    public:
        void dayin(int ha,int sa,int hb,int sb,bool p)//打印对角线之间的数字
        {
           if(p)//如果p为true,那么就从右上到左下打印
           {
               while(ha!=hb+1&&sa!=sb-1)
               {
                   cout<<a[ha][sa]<<" ";
                   ha+=1;
                   sa-=1;
               }
           }
           else//从左下到右上打印
           {
               while(hb!=ha-1&&sb!=sa+1)
               {
                   cout<<a[hb][sb]<<" ";
                   hb-=1;
                   sb+=1;
               }
           }
        }
    public:
       void hexin()
       {
          int ha=0,sa=0,hb=0,sb=0;//ha,sa分别代表a点的横坐标,纵坐标。hb,sb分别代表b点的横坐标,纵坐标。
          int endm=m-1,endn=n-1;
          cout<<a[0][0]<<" ";
          while (ha!=endn)//当a点的横坐标到达了最后一行时,隐藏着一个信息,就是sa已经到达了最右边,这时说明a点和b点都已经到最右下的点了
          {
              //注意:判断的顺序不能改变,对于a点的横纵坐标判断,必须先判断横坐标再判断纵坐标,因为横坐标的判断需要a原先的纵坐标
              //如果先判断a的纵坐标,那么a原先的纵坐标就有可能改变了,那么,a接下来要走的横坐标就有可能出错了
              //b点一样
              ha=sa==endm?ha+1:ha;//判断a点下一步应该走的横坐标,如果sa到了最后一列,那么ha应该往下走,否则,不变
              sa=sa==endm?sa:sa+1;//判断a点下一步应该走的纵坐标,如果sa没有到达最后一行,sa继续往右走,否则,sa不变
              sb=hb==endn?sb+1:sb;//同上
              hb=hb==endn?hb:hb+1;
              dayin(ha,sa,hb,sb,p);
              p=!p;//如果这次是右上到左下打印,那么下次一定是左下到右上打印。
          }
       }
};
int main()
{
    heat nul;
    nul.shuru();
    nul.hexin();
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值