找回密码
 欢迎注册
查看: 38897|回复: 49

[擂台] 打印螺旋方阵

[复制链接]
发表于 2008-9-4 09:57:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
从csdn看到这个,觉得挺有意思: c/c++ 打印下面的图形,看谁代码最短,只准用标准库 1 2 3 4 5 6 7 8 28 29 30 31 32 33 34 9 27 48 49 50 51 52 35 10 26 47 60 61 62 53 36 11 25 46 59 64 63 54 37 12 24 45 58 57 56 55 38 13 23 44 43 42 41 40 39 14 22 21 20 19 18 17 16 15
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 11:57:38 | 显示全部楼层
可以试着找一个公式。两条对角线将正方形分成四份,首先判断落在哪一份,而对于每个部分,数据分布还是挺规律的,找出公式就可以了。然后再看看这个公式还有没有什么特殊之处可以用来简化程序的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 14:26:03 | 显示全部楼层
模拟填充就可以了 先初始化到0 然后模拟人填充过程
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 14:27:29 | 显示全部楼层
最简单的代码是递归代码 每次只填充一层 我觉得
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 17:19:43 | 显示全部楼层
最简单的代码就是直接一个printf,呵呵
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 19:51:12 | 显示全部楼层
我想最好是一重循环做到 最低要求是两重循环 最多50行 不含空行和{, }行
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 21:30:58 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define Max 16
  4. int main(void)
  5. {
  6. int square[Max][Max] = {0};
  7. int n, num, len, x, y, xp, yp, inc;
  8. int i, j, k;
  9. printf("Input n value(n <= 1 exit):");
  10. scanf("%d", &n);
  11. printf("\n");
  12. if (n <= 1) exit(1);
  13. if (n > Max) n = Max;
  14. len = n - 1; num = 1;
  15. for (i = 0; i < n / 2; i ++)
  16. {
  17. x = i; y = i;
  18. for (j = 1; j <= 4; j ++)
  19. {
  20. if (j <= 2) inc = 1; else inc = -1;
  21. if (j & 1) {xp = 0; yp = inc;} else {xp = inc; yp = 0;}
  22. for (k = 1; k <= len; k ++)
  23. {
  24. square[x][y] = (num ++);
  25. x += xp; y += yp;
  26. }
  27. }
  28. len -= 2;
  29. }
  30. if (n & 1) square[n/2][n/2] = n * n;
  31. for (i = 0; i < n; i ++)
  32. {
  33. for (j = 0; j < n; j ++)
  34. printf("%4d", square[i][j]);
  35. printf("\n");
  36. }
  37. return (0);
  38. }
复制代码
在8时候的输出
  1. 1 2 3 4 5 6 7 8
  2. 28 29 30 31 32 33 34 9
  3. 27 48 49 50 51 52 35 10
  4. 26 47 60 61 62 53 36 11
  5. 25 46 59 64 63 54 37 12
  6. 24 45 58 57 56 55 38 13
  7. 23 44 43 42 41 40 39 14
  8. 22 21 20 19 18 17 16 15
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-5 07:09:30 | 显示全部楼层
更简化的双重循环
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define Max 16
  4. int main(void)
  5. {
  6. int square[Max][Max] = {0};
  7. int n, num, len, x, y;
  8. int i, j;
  9. printf("Input n value(n <= 1 exit):");
  10. scanf("%d", &n);
  11. printf("\n");
  12. if (n <= 1) exit(1);
  13. if (n > Max) n = Max;
  14. len = n - 1;
  15. num = 1;
  16. for (i = 0; i < n / 2; i ++)
  17. {
  18. x = i; y = i;
  19. for (j = 0; j < len; j ++)
  20. {
  21. square[x][y + j] = num + j;
  22. square[x + j][y + len] = num + len + j;
  23. square[x + len][y + len - j] = num + (len << 1) + j;
  24. square[x + len - j][y] = num + (len << 1) + len + j;
  25. }
  26. num += (len << 2);
  27. len -= 2;
  28. }
  29. if (n & 1) square[n/2][n/2] = n * n;
  30. for (i = 0; i < n; i ++)
  31. {
  32. for (j = 0; j < n; j ++)
  33. printf("%4d", square[i][j]);
  34. printf("\n");
  35. }
  36. return (0);
  37. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-5 10:12:40 | 显示全部楼层
//另一种思路
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define Max 16
  4. int main(void)
  5. {
  6. int square[Max+2][Max+2] = {0};
  7. int n, num;
  8. int i,x, y, xInc,yInc;
  9. printf("Input n value(n <= 1 exit):");
  10. scanf("%d", &n);
  11. printf("\n");
  12. if (n <= 1) exit(1);
  13. if (n > Max) n = Max;
  14. for (i=1;i<=n;i++)
  15. {
  16. square[0][i]=-1; //在四边建立围墙
  17. square[i][0]=-1;
  18. square[n+1][i]=-1;
  19. square[i][n+1]=-1;
  20. }
  21. x=y=num=xInc=1;
  22. yInc=0;
  23. while (true)
  24. {
  25. square[y][x]=num;
  26. if (num==n*n)
  27. break;
  28. if ( square[y+yInc][x+xInc]!=0) //撞到墙了,或者已填充
  29. {
  30. switch(xInc*2+yInc+2)
  31. {
  32. case 4: xInc=0; yInc=1; break; //改变方向
  33. case 3: xInc=-1; yInc=0; break;
  34. case 0: xInc=0;yInc=-1; break;
  35. case 1: xInc=1;yInc=0; break;
  36. }
  37. }
  38. x+=xInc;
  39. y+=yInc;
  40. num++;
  41. }
  42. for (y = 1; y <= n; y ++)
  43. {
  44. for (x = 1; x <= n; x++)
  45. printf("%4d", square[ y ][ x ]);
  46. printf("\n");
  47. }
  48. return (0);
  49. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-5 11:25:35 | 显示全部楼层
我也抛个砖,不过好像打反了,实在懒得改了,不知有没有哪位能突破直接打印! #include #include using namespace std; int i,j,t,p,q,z,data[8][8]; void test2() { #define r(x) (int)(x>0?x+.5:x-.5) #define O(x,n,k) r(1.4*n*x(0.78*k/n)) #define g(n,k,x) (abs(x)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-22 15:18 , Processed in 0.032696 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表