原帖及讨论:http://bbs.bccn.net/thread-135360-1-1.html /* 有许多算法问题是关于数字方阵的,多数通用的算法是计算规律和数据并排着输出 而本例是用直接写屏方法输出,它的方法不再是计算数据与规律,而是计算数据位置,"跳"着输出数据 最近很忙,因此算法思想就不写了,大家自己领悟:)
以下是用直接写屏的方法输出有规律的数字方阵的一些例子 Write By S.K */ /* 写屏添数法 一 输出字轮转组成一正方形,已n作为边长,比如: n=4: 1 12 11 10 2 13 16 9 3 14 15 8 4 5 6 7 n=5: 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9 */ /*Write By S.K*/ #include"stdio.h" int main(void) { int n,i,k,s=0,z=1,x=1,y=1; scanf("%d",&n); for(i=0;i<2*n-1;i++) { for(k=0;k<n-1-s;k++) { gotoxy(x*3,y); printf("%d",z); z++; switch(i%4) { case 0: y++; break; case 1: x++; break; case 2: y--; break; case 3: x--; } } if(i%4==3) { x++; y++; s+=2;} } gotoxy(x*3,y); printf("%d",z); getch(); } /*写屏添数法 二 写屏输出如下数字排列: n=3: 1 2 6 3 5 7 4 8 9 n=4: 1 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16 n=5: 1 2 6 7 15 3 5 8 14 16 4 9 13 17 22 10 12 18 21 23 11 19 20 24 25 n=6: 1 2 6 7 15 16 3 5 8 14 17 26 4 9 13 18 25 27 10 12 19 24 28 33 11 20 23 29 32 34 21 22 30 31 35 36 ....... 读入n,输出数字方阵 */ /*Write By S.K*/ #include<stdio.h> #include<math.h> int main(void) { int n,i,k,w=1,v=1,t=1,e=1,f; scanf("%d",&n); f=n; n=n*n/2; for(i=1;i<=f;i++) { if(e>n) break; (i%2) ? w=1,v=t : (w=t,v=1); for(k=1;k<=t;k++) { gotoxy(w*3,v); printf("%d",e); gotoxy((f-w+1)*3,f-v+1); printf("%d",n*2-e+1+f%2); e++; if(e>n) break; (i%2) ? w++,v-- : (w--,v++); } t++; } if(f%2) { gotoxy((f/2+1)*3,f/2+1); printf("%d",n+1); } getch(); }
|