题目描述:给定一个矩阵,要求按之字形打印出矩阵。
那么打印顺序为: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();
}