★★★我的算法实在太慢了!按照我的搞法需上10分钟才能全部出来! (100分)

  • 主题发起人 主题发起人 Dp521
  • 开始时间 开始时间
D

Dp521

Unregistered / Unconfirmed
GUEST, unregistred user!
★★★足彩程序★★★
要求不复杂,仅仅是出号:
从0000000000000(13位)->3333333333333(13位)
1.每一位的值必须<=3,且不能为2
3.穷举所有的可能
2.快速完成(因为后面还有条件,我都不敢往上加了!-_-)
------------------------------------------------------
我的乌龟算法是:
从0000000000000开始顺序+1,每加一次进行判断:
1.是否为2
2.是否进位
===========================================================
★★★有劳了大家了,搞出来了中了足彩都有份^_^★★★
需求:(界面贴图 http://dp521.asdfhost.com/football.jpg )
1、规定两个数组AI(I=1,2,。。。,12,13),BJ(J=1,2,3,4,5,6),AI其值域为(0,1,3),BJ其值域为(0,1,2,。。。,12,13);
2、对于数组AI我可以对任何几场比赛做初始赋值(因为每轮比赛都有几场比较好猜,我可直接规定它的结果即数组元素的值),同时也可规定任何几场比赛不能为某值(因为每轮比赛都有几场我可基本确定其可能胜或平即它的两种可能,那么我就可以事先规定其不可能的那种结果即数组元素的值),对于数组BJ我必须给其赋值否则程序无法进行。
3、然后对数组进行循环,这里要提示一下,该循环不是随机的,而是需要产生所有可能的结果,我怀疑你上次编的是不是问题出在随机上了。对于产生的每一个数组必须满足我的三个要求:
(1)、对于所有等于3的数组元素个数必须在区间(B1-B2)内,否则不予打印;
(2)、 对于所有等于1的数组元素个数必须在区间(B3-B4)内,否则不予打印;
(3)、对于所有等于0的数组元素个数必须在区间(B5-B6)内,否则不予打印;
4.
a.对于连续的等于3的AI不能超过5个;
b.对于连续的等于1,0的AI不能超过4个.
5.最后打印出的结果应该每五行有一条分隔线,分两列打印。
 
如果做成0000000000000(13位)->2222222222222(13位)应该快很多的!
 
To:dgates
当然这也是个办法!
如果按照你的写法,的确可以省不少事,只是不太与足球规则挂钩!
 
0000000000000(13位)->2222222222222(13位) 输出结果的时候把所有的2换为3 不就行了。。。
 
这是13位的全排列啊,共有3的13次方个,你显示出来有什么用?
 
是出几个还是穷举所有的可能
 
To:楼上的各位朋友
穷举所有的可能,主要先要选出来,再根据要求来筛选的!
-----------------------------------------------------
To:genl:
全部换成2当然可以,但能快速实现也不容易,你有好办法吗?
 
严重不理解筛选时为什么要穷举所有可能
 
To:52free大侠
由于事先并不知道足球胜负如何,所以才...
 
我是这样理解的不知对不对哦供你做个参考
比如说只有5场比赛(打个比方)
现在赌徒认为第三场肯定是主队胜,那第三位上的字符肯定是1
然后再将别的可能以1,2,3填到各自的空缺位上
不要用数值,用字符来表示,每个位置有1,2,3三种可能
已经确定的位置跳过
这样会大大增加筛选速度
 
总共有1594323种可能,一百多万个,你选得过来吗?
再一个每次从这么多种组合里选,谁能受得了?
我认为:每次生成一个组合,判断这个组合是否满足某种条件,满足,则作为备选号码,不满足,在生成一组
 
直接选肯定太慢了,因为要穷举3的13次方。
乱想:把已确定的场次放到前面去,如已知3、9、12场为1,则剩下10个位置,直接用三进制数1*3的10次仿-1做为最大值,依次递减直到0。
还是太慢了,你还是把需求写出来,大家帮你想想。
 
To:52free
的确,我做了13个Combo来让用户确定有把握的场次,当然这样是可以省一些事!就是不晓得顺序加1的和判断进位算法好不好
===============================================
To:kerbcurb
------------------------------------------------------------
我认为:每次生成一个组合,判断这个组合是否满足某种条件,满足,则作为备选号码,不满足,在生成一组
------------------------------------------------------------
我现在的问题是出号慢,如果出一个比一个,可能会更慢!(不晓得是不是这个意思?)
 
To:wolf_cyj,大家
★★★有劳了大家了,搞出来了中了足彩都有份^_^★★★
需求:(界面贴图 http://dp521.asdfhost.com/football.jpg )
1、规定两个数组AI(I=1,2,。。。,12,13),BJ(J=1,2,3,4,5,6),AI其值域为(0,1,3),BJ其值域为(0,1,2,。。。,12,13);
2、对于数组AI我可以对任何几场比赛做初始赋值(因为每轮比赛都有几场比较好猜,我可直接规定它的结果即数组元素的值),同时也可规定任何几场比赛不能为某值(因为每轮比赛都有几场我可基本确定其可能胜或平即它的两种可能,那么我就可以事先规定其不可能的那种结果即数组元素的值),对于数组BJ我必须给其赋值否则程序无法进行。
3、然后对数组进行循环,这里要提示一下,该循环不是随机的,而是需要产生所有可能的结果,我怀疑你上次编的是不是问题出在随机上了。对于产生的每一个数组必须满足我的三个要求:
(1)、对于所有等于3的数组元素个数必须在区间(B1-B2)内,否则不予打印;
(2)、 对于所有等于1的数组元素个数必须在区间(B3-B4)内,否则不予打印;
(3)、对于所有等于0的数组元素个数必须在区间(B5-B6)内,否则不予打印;
4.
a.对于连续的等于3的AI不能超过5个;
b.对于连续的等于1,0的AI不能超过4个.
5.最后打印出的结果应该每五行有一条分隔线,分两列打印。
 
你最好把软件编制细则和说明写出来,这是编制软件的第一步,这样大家才好帮你想办法
我对于足彩没有什么概念,我曾经做过一个福彩/体彩的,我知道有些人喜欢固定某些号码,我就有一个选项,添加固定号码,同样某些人认为某些号码不会出现,所以有一个选项,删除某些号码,足彩大概也有类似的情况吧
 
你的数组循环出来是为了打印,那么你可以先根据已知的场次得到3进制数的范围(把已知的数放到最前面,剩下数为3的剩下场次数次方),比如从A到B,然后用一次打印100个数(比如说),那应该不会很慢吧。
 
To:wolf_cyj
是个办法!
--------------------
To:kerbcurb
是的,差不多 ^_^,需求在上面!
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13: integer;
str, strData: string;
sl: TstringList;
start: integer;
d:single;
begin

start := gettickcount;
sl := TstringList.Create;
setlength(str, 13);
strData := '013';
for i1 := 1 to 3do
for i2 := 1 to 3do
for i3 := 1 to 3do
for i4 := 1 to 3do
for i5 := 1 to 3do
for i6 := 1 to 3do
for i7 := 1 to 3do
for i8 := 1 to 3do
for i9 := 1 to 3do
for i10 := 1 to 3do
for i11 := 1 to 3do
for i12 := 1 to 3do
for i13 := 1 to 3do
begin
str[1] := strData[i1];
str[2] := strData[i2];
str[3] := strData[i3];
str[4] := strData[i4];
str[5] := strData[i5];
str[6] := strData[i6];
str[7] := strData[i7];
str[8] := strData[i8];
str[9] := strData[i9];
str[10] := strData[i10];
str[11] := strData[i11];
str[12] := strData[i12];
str[13] := strData[i13];
sl.Add(str);
end;
d := (gettickcount - start)/1000;
Memo1.Lines.Add(format('%f s (count=%d )', [d,sl.count]));
freeandnil(sl);
end;

end.


object Form1: TForm1
Left = 192
Top = 107
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 280
Top = 72
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object Memo1: TMemo
Left = 440
Top = 40
Width = 185
Height = 337
TabOrder = 1
end
end
 
生成所有记录
大约 3到8 秒
 
后退
顶部