找回密码
 欢迎注册
楼主: shshsh_0510

[擂台] 打印螺旋方阵

[复制链接]
 楼主| 发表于 2008-9-5 13:23:12 | 显示全部楼层
和直接输出对比一下,不知哪位仁兄还能给优化一下,哪怕少几个字符也好 #include #include using namespace std; int i,j,t,p,q,z,d[64]; void test2(){ #define r(x) (int)(x>0?x+.5:x-.5) #define O(x,n,k) r(1.4*n*x(.78*k/n)) #define g(n,k,x) ((abs(x)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-5 13:48:45 | 显示全部楼层
变量j p q 可以省去,如果有round函数,第一个宏可以省去,则比直接输出大概长了下面两句的长度 int i,j,t,p,q,z,d[64]; #define O(x,n,k) round(1.4*n*x(.78*k/n)) 我是想不出其他法子了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-5 14:33:44 | 显示全部楼层
再少几个字符
  1. #include <iostream>
  2. #include <math.h>
  3. int i,t,z,d[64];
  4. void main(){
  5. #define r(x) (int)(x>0?x+.5:x-.5)
  6. #define g(x) ((abs(x)<t?x:t*x/abs(x))+3)
  7. #define f(x) for(i=x;i<64;i++)
  8. f(1){t=sqrt(i);t=t%2?(t+1)/2:t/2;z=i-4*t*t+3*t;d[g(r(1.4*t*sin(.78*z/t)))*8+g(r(1.4*t*cos(.78*z/t)))]=i;}
  9. f(0) std::cout<<(i%8?"\t":"\n")<<64-d[i];
  10. }
复制代码
[ 本帖最后由 shshsh_0510 于 2008-9-5 15:11 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-5 15:00:18 | 显示全部楼层
改出错了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-5 16:22:29 | 显示全部楼层
人工填充,有内到外,好长啊
  1. #include<stdio.h>
  2. #define MAX 8
  3. void main()
  4. {
  5. int iSquare = MAX*MAX;
  6. int i = 0,j=0,k=0;
  7. int iArr[MAX][MAX] = {0};
  8. bool bEnd = false;
  9. int hSub,lSub;
  10. bool hFlag,lFlag;
  11. if (MAX<2)
  12. return;
  13. if (MAX%2==0)//even
  14. {
  15. hSub = MAX/2;
  16. lSub = MAX/2-1;
  17. hFlag = false;
  18. lFlag = true;
  19. }
  20. else//odd
  21. {
  22. hSub = (MAX-1)/2;
  23. lSub = (MAX-1)/2;
  24. hFlag = true;
  25. lFlag = false;
  26. }
  27. iArr[hSub][lSub]= iSquare--;
  28. for (i=0;;i++)
  29. {
  30. for (j=0; j<=i; j++)//列
  31. {
  32. if (lFlag){
  33. lSub++;
  34. }
  35. else{
  36. lSub--;
  37. }
  38. iArr[hSub][lSub]= iSquare--;
  39. if (iSquare == 0){
  40. bEnd = true;
  41. break;
  42. }
  43. }
  44. lFlag = !lFlag;
  45. if (bEnd == true){
  46. break;
  47. }
  48. for (k=0; k<=i; k++)//行
  49. {
  50. if (hFlag){
  51. hSub++;
  52. }
  53. else{
  54. hSub--;
  55. }
  56. iArr[hSub][lSub] = iSquare--;
  57. }
  58. hFlag = !hFlag;
  59. }
  60. for (i=0;i<MAX;i++)
  61. {
  62. for (j=0;j<MAX;j++)
  63. {
  64. printf("%3d ",iArr[i][j]);
  65. }
  66. printf("\n");
  67. }
  68. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-5 16:31:16 | 显示全部楼层
再少几个字符
  1. #include <iostream>
  2. #include <math.h>
  3. int i,t,d[64];
  4. void main(){
  5. #define r(x) ((int)(x>0?x+.5:x-.5))
  6. #define g(x) ((abs(x)<t/2?x:t*x/2/abs(x))+3)
  7. #define f(x) for(i=x;i<64;i++)
  8. f(1){t=sqrt(i);t+=t%2;d[g(r(.7*t*sin(1.6*i/t-1.6*t+2.4)))*8+g(r(.7*t*cos(1.6*i/t-1.6*t+2.4)))]=i;}
  9. f(0) std::cout<<(i%8?"\t":"\n")<<64-d[i];
  10. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-5 16:37:46 | 显示全部楼层
晕 BT了 用#define就流于形式化了阿
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-5 17:13:40 | 显示全部楼层
其实用c版本应该更加短,比如main函数前面void可以不写,全局变量申明int可以省略,除了math.h头文件可以不包含.不过这种优化觉得意思不大
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-5 17:26:14 | 显示全部楼层
原帖由 mathe 于 2008-9-5 17:13 发表 全局变量申明int可以省略
这个怎么省略呀?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-5 17:47:38 | 显示全部楼层
比如c程序 i,j,main(){for(i=1,j=0;i<=100;j+=i,i++);printf("%d\n",j);} 是合法的c程序.(注意如果在Visual Studio上编译,将文件名后缀设为.c,同样在Linux下,要用gcc而不是g++编译)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-22 01:41 , Processed in 0.022682 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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