wayne 发表于 2013-5-11 10:30:45

不错,chyanog的Mathematica用的简直是炉火纯青啊

G-Spider 发表于 2013-5-11 22:04:11

虽然是可以筛选的,还是来两个比较慢的c实现,M=5的时候,基本上没法忍受等多久。;P#include <stdio.h>
#include <math.h>

int datacmp(int *data,int n)
{
    int i,j;
    if( data != abs(data-data) )
      return -1;      
    for(i=1;i<n-1;i++)
      for(j=0;j<n-1;j++)
            if( data != abs(data-data) )
                return -1;
   
    return 0;
}
   
void main()
{
    int a,b,c,d,e,f;
    int i,j;
    int data={0};
    for(a=1;a<=6;a++)
    {
      for(b=1;b<=6;b++)
      {
            if(a==b)
                continue;
            for(c=1;c<=6;c++)
            {
                if(a==c||b==c)
                  continue;
                for(d=1;d<=6;d++)
                {
                  if(a==d||b==d||c==d)
                        continue;
                  for(e=1;e<=6;e++)
                  {
                        if(a==e||b==e||c==e||d==e)
                            continue;
                        for(f=1;f<=6;f++)
                        {
                            if(a==f||b==f||c==f||d==f||e==f)
                              continue;
                            data=a;data=b;data=c;data=d;data=e;data=f;
                            if(0 != datacmp(data,3))
                              break;
                            printf("%d %d %d %d %d %d \n",data,data,data,data,data,data);
                        }
                  }
                }
            }
      }
    }
}#include <stdio.h>
#include <math.h>

#define M   4      /* 差三角的层数 */

#define N   (((M)*(M+1))/2)

int datacmp(int *data,int n)
{
    int i,j;
    if( data != abs(data-data) )
      return -1;   
    for(i=1;i<n-1;i++)
    {
      for(j=0;j<n-1;j++)
            if( data != abs(data-data) )
                return -1;
    }
    return 0;
}
   
void swap(int *data, int i, int offset)
{
    int tmp;
    tmp = data;
    data = data;
    data = tmp;
}

void order(int *data,int offset)
{
    int i,tmp;
    if(offset == N-1)
    {
      if(0 == datacmp(data,M))
      {
            for(i=0;i<N;i++)
                printf("%d ",data);
            printf("\n");
      }
      return;
    }
    for(i = offset; i < N; i++)
    {
      swap(data,i, offset);
      order(data,offset + 1);
      swap(data,i, offset);
    }
}

void main()
{
    int i,data;;
    for(i = 0; i<N; i++)
      data = i+1;
    order(data,0);
}

zgg___ 发表于 2013-5-15 17:02:22

呵呵,今天试了试,1-36的也没有找到呢。

chyanog 发表于 2013-5-15 18:35:16

21# wayne
wayne兄过奖了,我不会的地方多着呢,
前面的Mathematica代码又优化了一下,n=5时半秒就够了,构造"table"时发现这里Table比Map快的多(n = 5;
k = n (n + 1)/2;
table = Quiet@With[{
      expr=Evaluate /.Slot :> i[]]
      },
Table}]];
table = Pick, Tr@Range@k];
fmt = MatrixForm@Internal`PartitionRagged] &;
Do, {i, table}]
) // AbsoluteTiming
Clear["`*"]

hujunhua 发表于 2013-5-16 16:13:14

上面的程序将5改成6就蹦出很多行错误信息。

我猜想n>5时就无解了,而且证明起来可能不会太难。有时间了试一下。

chyanog 发表于 2013-5-16 19:17:05

25# hujunhua
看提示是似乎内存不够了

G-Spider 发表于 2013-5-16 22:07:20

22# G-Spider
datacmp函数写法有误,改一下:int datacmp(int *data,int n)
{
    int i,j;   
    for(i=1;i<n;i++)
      for(j=1;j<n;j++)
            if(j<=i)
                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]) )
                  return -1;
    return 0;
}

KeyTo9_Fans 发表于 2013-5-17 20:17:35

经验证,$9$阶、$10$阶、$11$阶都无解。

我同意$25$楼hujunhua版主的猜想。

#####

为了使问题更有趣,我们将楼主的条件放松,变成下面的问题:

————————————————————
给定$n$,求最小的$m$,使得:

存在一个$n$阶的、数字范围是$1$到$m$的、每个数字最多出现$1$次的差三角。
————————————————————

于是当$n\leq 8$时,结果如下:(为了图个方便,我将三角形横着摆了。)1: 1
   1
2: 3
   3
   2   1
3: 6
   6
   2   4
   5   3   1
4: 10
   9
10   1
   3   7   6
   8   5   2   4
5: 15
13
   310
1512   2
14   111   9
   6   8   7   4   5
6: 22
13
21   8
   31810
2219   1   9
20   21716   7
   61412   511   4
7: 33
19
3213
   32916
3330   115
31   2282712
   62523   52210
171114   9   418   8
8: 44
29
   623
433714
44   13622
   34140   418
4239   2383416
33   930281024   8
   726171315   51911

hujunhua 发表于 2013-5-17 22:36:01

当我感觉n>5无解的时候就在暗想,或许 KeyTo9_Fans能从中发现一个新数列,果然苗头初现。

我曾试图估算三角形顶尖上那个数的上限u(n),感觉当n充分大时,应有u(n)<1而导致无解。

hujunhua 发表于 2013-5-17 22:52:43

28# KeyTo9_Fans
算到11阶了,我想都不敢想哦!
是机器超强,还是算法高超?
页: 1 2 [3] 4
查看完整版本: 差三角