#include<iostream>
#include<Windows.h>
bool en=true;//用来记录数组前进的方向,true代表向右上角前进,false代表向左下角前进
int** zigzag(int n)
{
if(n<1)return (int**)(-1);
int** brick=new int *[n];
for(int l=0;l<n;l++)
{
brick[l]=new int[n];
}
int i=0,j=0,mark=0;
brick[i][j]=0;
while((i!=n-1)&&(j!=n-1))
{
for(int k=0;k<n*n-1;k++)
{
if(en==true&&i==0&&j!=n-1)//<span style="font-family: Arial, Helvetica, sans-serif;">判断是否往右上走到碰到上边缘并且不是右上角</span>
{
brick[i][++j]=++mark;
en=false;
}
else if(en==true&&i==0&&j==n-1)//<span style="font-family: Arial, Helvetica, sans-serif;">判断是否往右上走到头并且是右上角</span>
{
brick[++i][j]=++mark;
en=false;
}
else if(en==true&&j==n-1)//判断是否往右上走碰到右边缘
{
brick[++i][j]=++mark;
en=false;
}
else if(en==false&&j==0&&i!=n-1)//判断是否往左下走碰到左边缘并且不是左下角
{
brick[++i][j]=++mark;
en=true;
}
else if(en==false&&j==0&&i==n-1)//判断是否往左下走碰到左边缘并且是左下角
{
brick[i][++j]=++mark;
en=true;
}
else if(en==false&&i==n-1)//判断是否往左下走碰到下边缘
{
brick[i][++j]=++mark;
en=true;
}
else if(en==true)//正常往右上走
{
brick[--i][++j]=++mark;
}
else if(en==false)//正常往左下走
{
brick[++i][--j]=++mark;
}
else//出错了就骂自己
{
std::cout<<"stupid!\n";
}
}
}
return brick;
}
int main()
{
int haha=10;//设置haha的值可以输出边长为n的zigzag数组
int** zhuantou=zigzag(haha);
for(int m=0;m<haha;m++)
{
for(int n=0;n<haha;n++)
{
std::cout<<zhuantou[m][n]<<" ";
}
std::cout<<std::endl;
}
for(int m=0;m<haha;m++)
{
delete [] zhuantou[m];
}
delete [] zhuantou;
system("pause");
return 0;
}
=。=今天看了个zigzag数组的实现,于是打算自己写个,智商不高于是就按着数组变化的实际规律按照顺序撸了个代码
zigzag数组是类似于以下规律的数组
0 1 5 6
2 4 7 12
3 8 11 13
9 10 12 14