O
okokok3721
Unregistered / Unconfirmed
GUEST, unregistred user!
给下面组合程序加上条件限制程序:送200分再赠一个SOHU.vip收费信箱略表谢意!!
在大富翁上看到jeffrey_s,写的组合程序,很好,组号速度快。如果再加上以下限制程序就会更好了。哪位高手老师愿帮忙?
[组合程序]
procedure TForm1.Button1Click(Sender: TObject);
var
k, i1, i2, i3, i4, i5, i6, i7, v, Count: integer;
FLine: array of String[2];
FOut: array [1..7] of String[2];
FLines: TStrings;
Str: String;
begin
Count := Memo1.Lines.Count;
SetLength(FLine, Count + 1);
for k := 1 to Count do
FLine[k] := Memo1.Lines[k - 1];
k := GetTickCount;
v := 0;
FLines := TStringList.Create;
try
for i1 := 1 to Count - 6 do
begin
FOut[1] := FLine[i1];
for i2 := i1 + 1 to Count - 5 do
begin
FOut[2] := FLine[i2];
for i3 := i2 + 1 to Count - 4 do
begin
FOut[3] := FLine[i3];
for i4 := i3 + 1 to Count - 3 do
begin
FOut[4] := FLine[i4];
for i5 := i4 + 1 to Count - 2 do
begin
FOut[5] := FLine[i5];
for i6 := i5 + 1 to Count - 1 do
begin
FOut[6] := FLine[i6];
for i7 := i6 + 1 to Count do
begin
FOut[7] := FLine[i7];
inc(v);
if v < 500 then
begin
str := Format('%3s%3s%3s%3s%3s%3s%3s',
[FOut[1], FOut[2], FOut[3], FOut[4], FOut[5], FOut[6],
FOut[7]]);
FLines.Add(Str);
end;
end;
end;
end;
end;
end;
end;
end;
Memo2.Lines.Assign(FLines);
finally
FLines.Free;
end;
TButton(Sender).Caption := Format('%6d ms',[integer(GetTickCount) - k]);
Caption := IntToStr(v);
end;
我的限制条件是:
条件1 两数之差:
在所有的选7组合数组中,共有①、②、③、④、⑤、⑥、⑦七位数字。如果对这7位数取2进行组合,共有①②、①③、①④、①⑤、①⑥、①⑦、②③、②④、②⑤、②⑥、②⑦、③④、③⑤、③⑥、③⑦、④⑤、④⑥、④⑦、⑤⑥、⑤⑦、⑥⑦等21种组合。
两数之差就是上面每两位对应的数相减后的差值。
两数之差最小值为1,最大值为35。两数之差就取最小值与最大值之间的值域;如果在分析中能更精确地判断两数之差的具体值,如①②之和的值初步确定为3、4、6、8等值,便将上面数值直接填入到指定数值中。计算机自动将①②之差的值为3、4、6、8的数组找出并保留下来,把其余不符合条件的去掉。如果不能确定具体差值,就把最小值和最大值输入到相关两位数组合的最小值、最大值下面。如果什么都确定不了,就什么也不用输入。
以下面一组数字为例:
数位号:①、 ②、 ③、 ④、 ⑤、 ⑥、 ⑦
数组1:01 、 05 、06 12 13 25 29
数组2:02, 08, 12, 16, 17, 23, 25
数组3:01, 06, 07, 08, 19, 28, 36
……
数组N
上面共7位数,第一组数的第①位“1”与第②位“5”两数之差为“4” ,即“5-1=4”(注意:两数之差只能是大数减小数,即后面的数减去前面的数); 第②位的“5”与第⑦位的“29”两数之差是“24”,即“29-5=24”……以此类推。两数之差就是对七位数字中每两位数之间的差进行限定。
条件2 两数之和:
两数之和道理与两数之差一样,只不过是将两数相减变成了两数相加。两数之和最小值为3,最大值为71。两数之和就取最小值与最大值之间的数域;如果在分析中能更精确地判断两数之和的具体值,如①②之和的值初步确定为5、6,8,9等值,便将上面数值直接填入到指定数值中。计算机自动将①②之和的值为5、6、8、9的数组找出并保留下来,把其余不符合条件的去掉。如果不能确定具体和值,就把最小值和最大值输入到相关两位数组合的最小值、最大值下面。如果什么都确定不了,就什么也不用输入。
条件3 三数和:
与两数之和条件类似,三数之和是将七位数取3进行组合,即123 124 125 ……567,共有35组,三数和就是对三位数相对应的数进行相加。再以上面数组为例,123的和就是第①位+第 ②位+第③位相对应的数字之和,即“1+5+6=12,”以此类推。三数和最小值为6,最大值为105。三数和就是取最小值与最大值之间的值域;如果在分析中能更精确地判断三数和的具体值,如123之和初步确定为7、9、11 、12等值,便将上面数值直接填入到指定数值中。如果不能确定具体和值,就把最小值和最大值输入到相关两位数组合的最小值、最大值下面。如果什么都确定不了,就什么也不用输入。
条件4 四数和:
道理与三数和一样,只不是将三个数相加改成四个数相加,七位数4的组合共35组,即1234,1235……4567。四数和最小值为10,最大值为138。四数和就是取最小值与最大值之间的值域;如果在分析中能更精确地判断四数和的具体值,如1234之和初步确定为22 、23、24 、25等值,便将上面数值直接填入到指定数值中。如果不能确定具体和值,就把最小值和最大值输入到相关两位数组合的最小值、最大值下面。如果什么都确定不了,就什么也不用输入。
以上4个条件我是用STRINGGRID组件,条件显示结构如下:
最小值 最大值 指定数值(总数控制在30个数值以内)
第1位与第2位之差 单个数据 单个数据 多个数据
第1位与第3位之差 单个数据 单个数据 多个数据
第1位与第4位之差 单个数据 单个数据 多个数据
……
第6位与第7位之差 单个数据 单个数据 多个数据
在大富翁上看到jeffrey_s,写的组合程序,很好,组号速度快。如果再加上以下限制程序就会更好了。哪位高手老师愿帮忙?
[组合程序]
procedure TForm1.Button1Click(Sender: TObject);
var
k, i1, i2, i3, i4, i5, i6, i7, v, Count: integer;
FLine: array of String[2];
FOut: array [1..7] of String[2];
FLines: TStrings;
Str: String;
begin
Count := Memo1.Lines.Count;
SetLength(FLine, Count + 1);
for k := 1 to Count do
FLine[k] := Memo1.Lines[k - 1];
k := GetTickCount;
v := 0;
FLines := TStringList.Create;
try
for i1 := 1 to Count - 6 do
begin
FOut[1] := FLine[i1];
for i2 := i1 + 1 to Count - 5 do
begin
FOut[2] := FLine[i2];
for i3 := i2 + 1 to Count - 4 do
begin
FOut[3] := FLine[i3];
for i4 := i3 + 1 to Count - 3 do
begin
FOut[4] := FLine[i4];
for i5 := i4 + 1 to Count - 2 do
begin
FOut[5] := FLine[i5];
for i6 := i5 + 1 to Count - 1 do
begin
FOut[6] := FLine[i6];
for i7 := i6 + 1 to Count do
begin
FOut[7] := FLine[i7];
inc(v);
if v < 500 then
begin
str := Format('%3s%3s%3s%3s%3s%3s%3s',
[FOut[1], FOut[2], FOut[3], FOut[4], FOut[5], FOut[6],
FOut[7]]);
FLines.Add(Str);
end;
end;
end;
end;
end;
end;
end;
end;
Memo2.Lines.Assign(FLines);
finally
FLines.Free;
end;
TButton(Sender).Caption := Format('%6d ms',[integer(GetTickCount) - k]);
Caption := IntToStr(v);
end;
我的限制条件是:
条件1 两数之差:
在所有的选7组合数组中,共有①、②、③、④、⑤、⑥、⑦七位数字。如果对这7位数取2进行组合,共有①②、①③、①④、①⑤、①⑥、①⑦、②③、②④、②⑤、②⑥、②⑦、③④、③⑤、③⑥、③⑦、④⑤、④⑥、④⑦、⑤⑥、⑤⑦、⑥⑦等21种组合。
两数之差就是上面每两位对应的数相减后的差值。
两数之差最小值为1,最大值为35。两数之差就取最小值与最大值之间的值域;如果在分析中能更精确地判断两数之差的具体值,如①②之和的值初步确定为3、4、6、8等值,便将上面数值直接填入到指定数值中。计算机自动将①②之差的值为3、4、6、8的数组找出并保留下来,把其余不符合条件的去掉。如果不能确定具体差值,就把最小值和最大值输入到相关两位数组合的最小值、最大值下面。如果什么都确定不了,就什么也不用输入。
以下面一组数字为例:
数位号:①、 ②、 ③、 ④、 ⑤、 ⑥、 ⑦
数组1:01 、 05 、06 12 13 25 29
数组2:02, 08, 12, 16, 17, 23, 25
数组3:01, 06, 07, 08, 19, 28, 36
……
数组N
上面共7位数,第一组数的第①位“1”与第②位“5”两数之差为“4” ,即“5-1=4”(注意:两数之差只能是大数减小数,即后面的数减去前面的数); 第②位的“5”与第⑦位的“29”两数之差是“24”,即“29-5=24”……以此类推。两数之差就是对七位数字中每两位数之间的差进行限定。
条件2 两数之和:
两数之和道理与两数之差一样,只不过是将两数相减变成了两数相加。两数之和最小值为3,最大值为71。两数之和就取最小值与最大值之间的数域;如果在分析中能更精确地判断两数之和的具体值,如①②之和的值初步确定为5、6,8,9等值,便将上面数值直接填入到指定数值中。计算机自动将①②之和的值为5、6、8、9的数组找出并保留下来,把其余不符合条件的去掉。如果不能确定具体和值,就把最小值和最大值输入到相关两位数组合的最小值、最大值下面。如果什么都确定不了,就什么也不用输入。
条件3 三数和:
与两数之和条件类似,三数之和是将七位数取3进行组合,即123 124 125 ……567,共有35组,三数和就是对三位数相对应的数进行相加。再以上面数组为例,123的和就是第①位+第 ②位+第③位相对应的数字之和,即“1+5+6=12,”以此类推。三数和最小值为6,最大值为105。三数和就是取最小值与最大值之间的值域;如果在分析中能更精确地判断三数和的具体值,如123之和初步确定为7、9、11 、12等值,便将上面数值直接填入到指定数值中。如果不能确定具体和值,就把最小值和最大值输入到相关两位数组合的最小值、最大值下面。如果什么都确定不了,就什么也不用输入。
条件4 四数和:
道理与三数和一样,只不是将三个数相加改成四个数相加,七位数4的组合共35组,即1234,1235……4567。四数和最小值为10,最大值为138。四数和就是取最小值与最大值之间的值域;如果在分析中能更精确地判断四数和的具体值,如1234之和初步确定为22 、23、24 、25等值,便将上面数值直接填入到指定数值中。如果不能确定具体和值,就把最小值和最大值输入到相关两位数组合的最小值、最大值下面。如果什么都确定不了,就什么也不用输入。
以上4个条件我是用STRINGGRID组件,条件显示结构如下:
最小值 最大值 指定数值(总数控制在30个数值以内)
第1位与第2位之差 单个数据 单个数据 多个数据
第1位与第3位之差 单个数据 单个数据 多个数据
第1位与第4位之差 单个数据 单个数据 多个数据
……
第6位与第7位之差 单个数据 单个数据 多个数据