找回密码
 欢迎注册
楼主: 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.    
  13.     return 0;
  14. }
  15.    
  16. void main()
  17. {
  18.     int a,b,c,d,e,f;
  19.     int i,j;
  20.     int data[6]={0};
  21.     for(a=1;a<=6;a++)
  22.     {
  23.         for(b=1;b<=6;b++)
  24.         {
  25.             if(a==b)
  26.                 continue;
  27.             for(c=1;c<=6;c++)
  28.             {
  29.                 if(a==c||b==c)
  30.                     continue;
  31.                 for(d=1;d<=6;d++)
  32.                 {
  33.                     if(a==d||b==d||c==d)
  34.                         continue;
  35.                     for(e=1;e<=6;e++)
  36.                     {
  37.                         if(a==e||b==e||c==e||d==e)
  38.                             continue;
  39.                         for(f=1;f<=6;f++)
  40.                         {
  41.                             if(a==f||b==f||c==f||d==f||e==f)
  42.                                 continue;
  43.                             data[0]=a;data[1]=b;data[2]=c;data[3]=d;data[4]=e;data[5]=f;
  44.                             if(0 != datacmp(data,3))
  45.                                 break;
  46.                             printf("%d %d %d %d %d %d \n",data[0],data[1],data[2],data[3],data[4],data[5]);
  47.                         }
  48.                     }
  49.                 }
  50.             }
  51.         }
  52.     }
  53. }
复制代码
  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.    
  19. void swap(int *data, int i, int offset)
  20. {
  21.     int tmp;
  22.     tmp = data[offset];
  23.     data[offset] = data[i];
  24.     data[i] = tmp;
  25. }

  26. void order(int *data,int offset)
  27. {
  28.     int i,tmp;
  29.     if(offset == N-1)
  30.     {
  31.         if(0 == datacmp(data,M))
  32.         {
  33.             for(i=0;i<N;i++)
  34.                 printf("%d ",data[i]);
  35.             printf("\n");
  36.         }
  37.         return;
  38.     }
  39.     for(i = offset; i < N; i++)
  40.     {
  41.         swap(data,i, offset);
  42.         order(data,offset + 1);
  43.         swap(data,i, offset);
  44.     }
  45. }

  46. void main()
  47. {
  48.     int i,data[N];;
  49.     for(i = 0; i<N; i++)
  50.         data[i] = i+1;
  51.     order(data,0);
  52. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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-4-20 09:47 , Processed in 0.068183 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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