题目描述:

给出一个二维数组,按照之字形的顺序打印出来

分析:

 如图 如果着眼于局部按区分数组边界的方法来做得到结果,过程需要处理边界,考察抠边界的能力,如果着眼于整体就会非常的简单。通过观察可以发现,按照题目要求,数组每次拐弯时,之字形的同一条直线的边界距离(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);
}