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

[擂台] 差三角

[复制链接]
发表于 2013-5-11 10:30:45 | 显示全部楼层
不错,chyanog的Mathematica用的简直是炉火纯青啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-11 22:04:11 | 显示全部楼层
虽然是可以筛选的,还是来两个比较慢的c实现,M=5的时候,基本上没法忍受等多久。
  1. #include <stdio.h>
  2. #include <math.h>
  3. int datacmp(int *data,int n)
  4. {
  5. int i,j;
  6. if( data[0] != abs(data[1]-data[2]) )
  7. return -1;
  8. for(i=1;i<n-1;i++)
  9. for(j=0;j<n-1;j++)
  10. if( data[2*i+j-1] != abs(data[2*i+j+1]-data[2*i+j+2]) )
  11. return -1;
  12. return 0;
  13. }
  14. void main()
  15. {
  16. int a,b,c,d,e,f;
  17. int i,j;
  18. int data[6]={0};
  19. for(a=1;a<=6;a++)
  20. {
  21. for(b=1;b<=6;b++)
  22. {
  23. if(a==b)
  24. continue;
  25. for(c=1;c<=6;c++)
  26. {
  27. if(a==c||b==c)
  28. continue;
  29. for(d=1;d<=6;d++)
  30. {
  31. if(a==d||b==d||c==d)
  32. continue;
  33. for(e=1;e<=6;e++)
  34. {
  35. if(a==e||b==e||c==e||d==e)
  36. continue;
  37. for(f=1;f<=6;f++)
  38. {
  39. if(a==f||b==f||c==f||d==f||e==f)
  40. continue;
  41. data[0]=a;data[1]=b;data[2]=c;data[3]=d;data[4]=e;data[5]=f;
  42. if(0 != datacmp(data,3))
  43. break;
  44. printf("%d %d %d %d %d %d \n",data[0],data[1],data[2],data[3],data[4],data[5]);
  45. }
  46. }
  47. }
  48. }
  49. }
  50. }
  51. }
复制代码
  1. #include <stdio.h>
  2. #include <math.h>
  3. #define M 4 /* 差三角的层数 */
  4. #define N (((M)*(M+1))/2)
  5. int datacmp(int *data,int n)
  6. {
  7. int i,j;
  8. if( data[0] != abs(data[1]-data[2]) )
  9. return -1;
  10. for(i=1;i<n-1;i++)
  11. {
  12. for(j=0;j<n-1;j++)
  13. if( data[2*i+j-1] != abs(data[2*i+j+1]-data[2*i+j+2]) )
  14. return -1;
  15. }
  16. return 0;
  17. }
  18. void swap(int *data, int i, int offset)
  19. {
  20. int tmp;
  21. tmp = data[offset];
  22. data[offset] = data[i];
  23. data[i] = tmp;
  24. }
  25. void order(int *data,int offset)
  26. {
  27. int i,tmp;
  28. if(offset == N-1)
  29. {
  30. if(0 == datacmp(data,M))
  31. {
  32. for(i=0;i<N;i++)
  33. printf("%d ",data[i]);
  34. printf("\n");
  35. }
  36. return;
  37. }
  38. for(i = offset; i < N; i++)
  39. {
  40. swap(data,i, offset);
  41. order(data,offset + 1);
  42. swap(data,i, offset);
  43. }
  44. }
  45. void main()
  46. {
  47. int i,data[N];;
  48. for(i = 0; i<N; i++)
  49. data[i] = i+1;
  50. order(data,0);
  51. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-15 17:02:22 | 显示全部楼层
呵呵,今天试了试,1-36的也没有找到呢。

评分

参与人数 1贡献 +3 收起 理由
KeyTo9_Fans + 3 你是对的

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-5-15 18:35:16 | 显示全部楼层
21# wayne wayne兄过奖了,我不会的地方多着呢, 前面的Mathematica代码又优化了一下,n=5时半秒就够了,构造"table"时发现这里Table比Map快的多
  1. (n = 5;
  2. k = n (n + 1)/2;
  3. table = Quiet@With[{
  4. expr=Evaluate[Join@@NestList[Abs@Differences@# &, Slot~Array~n, n-1] /. Slot[x_] :> i[[x]]]
  5. },
  6. Table[expr, {i, Permutations[Range@k, {n}]}]];
  7. table = Pick[table, Total[table, {2}], Tr@Range@k];
  8. fmt = MatrixForm@Internal`PartitionRagged[Reverse@#, Range[n]] &;
  9. Do[If[Unequal @@ i, Print@fmt@i], {i, table}]
  10. ) // AbsoluteTiming
  11. Clear["`*"]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-16 16:13:14 | 显示全部楼层
上面的程序将5改成6就蹦出很多行错误信息。 我猜想n>5时就无解了,而且证明起来可能不会太难。有时间了试一下。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-5-16 19:17:05 | 显示全部楼层
25# hujunhua 看提示是似乎内存不够了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-16 22:07:20 | 显示全部楼层
22# G-Spider datacmp函数写法有误,改一下:
  1. int datacmp(int *data,int n)
  2. {
  3. int i,j;
  4. for(i=1;i<n;i++)
  5. for(j=1;j<n;j++)
  6. if(j<=i)
  7. if( data[( ( (i)*(i+1) )/2)-i+j-1] != abs(data[( ( (i+1)*(i+1+1) )/2)-(i+1)+j-1]-data[( ( (i+1)*(i+1+1) )/2)-(i+1)+j+1-1]) )
  8. return -1;
  9. return 0;
  10. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-17 20:17:35 | 显示全部楼层
经验证,$9$阶、$10$阶、$11$阶都无解。 我同意$25$楼hujunhua版主的猜想。 ##### 为了使问题更有趣,我们将楼主的条件放松,变成下面的问题: ———————————————————— 给定$n$,求最小的$m$,使得: 存在一个$n$阶的、数字范围是$1$到$m$的、每个数字最多出现$1$次的差三角。 ———————————————————— 于是当$n\leq 8$时,结果如下:(为了图个方便,我将三角形横着摆了。)
  1. 1: 1
  2. 1
  3. 2: 3
  4. 3
  5. 2 1
  6. 3: 6
  7. 6
  8. 2 4
  9. 5 3 1
  10. 4: 10
  11. 9
  12. 10 1
  13. 3 7 6
  14. 8 5 2 4
  15. 5: 15
  16. 13
  17. 3 10
  18. 15 12 2
  19. 14 1 11 9
  20. 6 8 7 4 5
  21. 6: 22
  22. 13
  23. 21 8
  24. 3 18 10
  25. 22 19 1 9
  26. 20 2 17 16 7
  27. 6 14 12 5 11 4
  28. 7: 33
  29. 19
  30. 32 13
  31. 3 29 16
  32. 33 30 1 15
  33. 31 2 28 27 12
  34. 6 25 23 5 22 10
  35. 17 11 14 9 4 18 8
  36. 8: 44
  37. 29
  38. 6 23
  39. 43 37 14
  40. 44 1 36 22
  41. 3 41 40 4 18
  42. 42 39 2 38 34 16
  43. 33 9 30 28 10 24 8
  44. 7 26 17 13 15 5 19 11
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-17 22:36:01 | 显示全部楼层
当我感觉n>5无解的时候就在暗想,或许 KeyTo9_Fans能从中发现一个新数列,果然苗头初现。 我曾试图估算三角形顶尖上那个数的上限u(n),感觉当n充分大时,应有u(n) <1而导致无解。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-17 22:52:43 | 显示全部楼层
28# KeyTo9_Fans 算到11阶了,我想都不敢想哦! 是机器超强,还是算法高超?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-21 21:02 , Processed in 0.025482 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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