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++;//列的开始坐标增加
}
}
相关文章推荐
- zigzag数组,螺旋数组生成
- zigzag数组和螺旋数组
- zigzag数组,螺旋数组
- 生成一个螺旋数组
- 生成螺旋数组,递归
- zigzag数组的生成
- 世界独创的螺旋数组低于n(o^2)的生成算法
- Zigzag数组
- 析JSON数组生成对象实体集合
- php json接口转化为数组 生成xml接口
- 生成数组
- 安卓Zxing生成Data Matrix、PDF417二维码错误:数组下标异常
- php数组生成XML
- awk之生成shell数组
- 原生js生成渐变色数组集合
- JavaScript概率游戏抽奖根据cookie判断是否填写资料,从而显示相关的提示;判断元素下标是否在随机生成的数组中,有即让其抽奖
- 用随机函数生成无周期随机序列(数组)
- swift-for循环遍历,遍历字典,循环生成数组
- 输出螺旋数组(难度:1颗星)
- 螺旋数组