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阶了,我想都不敢想哦!
是机器超强,还是算法高超?