之字形打印数组
题目描述:
给出一个二维数组,按照之字形的顺序打印出来
分析:
如图 如果着眼于局部按区分数组边界的方法来做得到结果,过程需要处理边界,考察抠边界的能力,如果着眼于整体就会非常的简单。通过观察可以发现,按照题目要求,数组每次拐弯时,之字形的同一条直线的边界距离(0,0)的位置都是一样的,每次拐弯的不同之处就在于拐的方向不同,一次是向右上,一次是向左下,用一个标志位标志走的方向即可
代码实现
#include<iostream>
using namespace std;
void oppsit(int a[4][5],int row1,int row2,int col1,int col2,bool f); /*f为标志位,表示是向右上还是左下*/
void print(int a[4][5],int row1,int row2,int col1,int col2,int maxr,int maxc)
{
int crow = row1;
int ccol = col1;
bool f=false;
while(row1 != (maxr + 1))/*到最右边停止*/
{
oppsit(a,row1,row2,col1,col2,f);
/*向右向下延伸*/
row1 = col1 == maxc ? row1 + 1 : row1;
col1 = col1 == maxc ? col1 : col1 + 1;
col2 = row2 == maxr ? col2 + 1 : col2;
row2 = row2 == maxr ? row2 : row2 + 1;
f = !f; /*f转变方向*/
}
}
/*打印之字同一条线上的数据*/
void oppsit(int a[4][5],int row1,int row2,int col1,int col2,bool f)
{
if(f)
{
while(row1<=row2)
{
cout<<a[row1++][col1--]<<" ";
}
}
else
{
while(row2>=row1)
{
cout<<a[row2--][col2++]<<" ";
}
}
}
int main()
{
int a[4][5]={1,3,5,8,4,9,34,89,34,0,34,2,6,7,34,65,87,234,6,23};
print(a,0,0,0,0,3,4);
}