您的位置:首页 > 其它

zigzag数组,螺旋数组生成

2012-10-11 22:13 411 查看

转自:http://www.cnblogs.com/lovell-liu/archive/2011/09/19/2181598.html

zigzag数组



#include"stdio.h"
#include"stdlib.h"

intGetNum(inti,intj,intN,constint*sum);
voidSUM(intN,int*sum);

/*
打印zigzag数组
0156141527284445656690
24713162629434664678991
3812172530424763688892113
911182431414862698793112114
10192332404961708694111115132
202233395060718595110116131133
2134385159728496109117130134147
35375258738397108118129135146148
365357748298107119128136145149158
5456758199106120127137144150157159
557680100105121126138143151156160165
7779101104122125139142152155161164166
78102103123124140141153154162163167168
*/
intmain()
{
intN;
scanf("%d",&N);
int**a=(int**)malloc(N*sizeof(int));
for(inti=0;i<N;i++)
{
a[i]=(int*)malloc(N*sizeof(int));
}
int*sum=(int*)malloc((2*N-1)*sizeof(int));
SUM(N,sum);
for(inti=0;i<N;i++)
{
for(intj=0;j<N;j++)
{
a[i][j]=GetNum(i,j,N,sum);
}
}

for(inti=0;i<N;i++)
{
for(intj=0;j<N;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
system("pause");
}

intGetNum(inti,intj,intN,constint*sum)
{
intlev=i+j;
if((i+j)<N)
{
if((i+j)%2==0)
{
returnsum[i+j]-i;
}
else
{
returnsum[i+j]-j;
}
}
else
{
if((i+j)%2==0)
{
returnsum[i+j]-(N-1-j);
}
else
{
returnsum[i+j]-(N-1-i);
}
}
}

voidSUM(intN,int*sum)
{
sum[0]=0;
for(inti=1;i<=2*N-1;i++)
{
if(i<N)
{
sum[i]=sum[i-1]+i+1;
}
else
{
sum[i]=sum[i-1]+2*N-i-1;
}
}
}




螺旋数组



/*
打印螺旋数组
111112113114115116117118119120121
11073747576777879808182
10972434445464748495083
10871422122232425265184
10770412078910275285
10669401961211285386
10568391854312295487
10467381716151413305588
10366373635343332315689
10265646362616059585790
101100999897969594939291
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#defineMAX(X,Y)(X)>=(Y)?(X):(Y);
intfoo(int,int);

intmain()
{
intn;
scanf("%d",&n);
for(intj=n;j>=-1*n;j--)
{
for(inti=-1*n;i<=n;i++)
{
printf("%4d",foo(i,j));
}
printf("\n");
}
system("pause");
}

intfoo(intx,inty)
{
intl=MAX(abs(x),abs(y));
intmax=(2*l-1)*(2*l-1);
if(x==y&&x==0)
{
return1;
}
if(x==y&&x==l)
{
returnmax+8*(l);
}
if(x==l)
{
returnmax+(l-y);
}
elseif(y==-1*l)
{
returnmax+2*l+(l-x);
}
elseif(x==-1*l)
{
returnmax+6*l-(l-y);
}
else
{
returnmax+8*(l)-(l-x);
}
}

问题描述:螺旋式打印一个二维数组。如

1163217

864323

257812

2124613

要求打印后顺序为:

11632172312136422128643875

此题的思路有很多中,最容易想到的方法就是设置一个表示方向的变量,根据当前的方向来判断下一步的操作,当到达边界的时候方向顺时针改变。另外有一个bool型的数组来表示相应位置是否被访问过,初始化都是0(未访问),当输出一个数就把相应位置的标记置为1。在前方向上如果碰到已经被访问过的位置就顺时针改变方向,一直到最后所有位置的数都访问位置。

个人觉得上面的算法写出的程序比较繁琐,下面提供一种比较简单的算法。在输出的时候可以给水平方向和垂直方向各设置两个坐标,start_x,end_x,start_y,end_y,分别表示当前水平方向输出区间应该在start_x和end_x之间,垂直方向输出区间在start_y和end_y直接,每次转弯的时候只需要改变区间的边界就可以了。具体代码如下:

intarr[6][5]=

{{1,16,3,2,17},

{8,6,4,3,23},

{2,5,7,8,12},

{21,2,4,6,13},

{11,111,111,132,12},

{31,311,4111,332,32}

};

voidmain()

{

//初始的区间坐标

intstartX=0,endX=4;

intstartY=0,endY=5;

while(startX<=endX&&startY<=endY)//循环条件

{

inti;

for(i=startX;i<=endX;i++)//输出上边的行

cout<<arr[startY][i]<<"";

startY++;//行的开始坐标增加

for(i=startY;i<=endY;i++)//输出右边的列

cout<<arr[i][endX]<<"";

endX--;//列的结束坐标减小

for(i=endX;i>=startX;i--)//输出下边边的行

cout<<arr[endY][i]<<"";

endY--;//行的结束坐标减小

for(i=endY;i>=startY;i--)//输出左边的列

cout<<arr[i][startX]<<"";

startX++;//列的开始坐标增加

}

}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: