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

[擂台] 打印螺旋方阵

[复制链接]
 楼主| 发表于 2008-9-5 13:23:12 | 显示全部楼层
和直接输出对比一下,不知哪位仁兄还能给优化一下,哪怕少几个字符也好
#include <iostream>
#include <math.h>
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)<n?x:n*x/abs(x))+3)
for(i=1;i<64;i++){p=sqrt(i);t=p%2?(p+1)/2:p/2;z=i-4*t*t+3*t;d[g(t,z,O(sin,t,z))*8+g(t,z,O(cos,t,z))]=i;}
for(i=0;i<64;i++)cout<<(i%8?"\t":"\n")<<64-d[i];
}


void test1(){
cout<<"1 2 3 4 5 6 7 8\n28 29 30 31 32 33 34 "
<<"9\n27 48 49 50 51 52 35 10\n26 47 60 61 62 53 36 11\n25 46 59 64 63 54 37 12\n24 45 58 57 56 55 38 13\n"
<<"23 44 43 42 41 40 39 14\n22 21 20 19 18 17 16 15";
}

void main(){
        test2();
        cout<<endl;
        test1();
}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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-4-26 19:32 , Processed in 0.056963 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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