找回密码
 加入
搜索
查看: 13002|回复: 18

[效率算法] 求一算法

 火.. [复制链接]
发表于 2011-3-15 12:59:24 | 显示全部楼层 |阅读模式
本帖最后由 foboy 于 2011-3-18 01:49 编辑

现在在做一个棋牌游戏的辅助,里面的玩法需要一个从5个数字里选出3个数的操作,一个人的思路有限,看看大家能做出来的最有效率的代码是什么。
注意,是寻找最有效率的计算方法,过段时间我回来把所有贴出来的代码测试一次运行效率,效率最高的人我会把您的大名写到这里狠狠赞美一番,但是没有物质奖励 .
首先声明,此辅助是收钱给别人做的,但是我不是想利用大家的智慧去自己赚钱。发完帖子后我自己也会去做,做完后才会来论坛查看大家的思路,并贴出自己的代码。
担心你代码被我利用去赚钱的请不要理会此贴。
选数的要求:
从5个数字里选出3个,使这三个数相加的和是10的倍数。这5个数都是1到10之间的整数。

事先定义一个数组,里面的数字是随机的:
Global $g_array[5]
For $i = 0 To 4
        $g_array[$i] = Random(1, 10, 1)
Next

请做成一个类似这样的函数:
Func _myfunc($_array);$_array是包含5个数的数组
        If UBound($_array)<5 Then Return SetError(1,1,0)
        ;计算代码
        
        ;找到符合条件的3个数就以字符串的形式返回其序列,例如前3个满足条件,就返回“123”,后三个数符合条件就返回“345”.注意,一定要返回这三个数的角标,以便知道它是第几张牌。不要返回由这三个数组成的新数组。
        ;没有符合条件的3个数,就设置@error为1 并返回0
EndFunc

最高效代码是3mile写的,代码在8楼。

下面是我自己写的:
游客,如果您要查看本帖隐藏内容请回复

调用100次此函数,算出来的平均时间:0.0437982418932512ms
游客,如果您要查看本帖隐藏内容请回复
发表于 2011-3-15 13:37:06 | 显示全部楼层
用动态算法:调用自己本身来实现循环,先排除数组里的第一个数,其它的可能组合的数量 + 数组里所有数组合成5-$array[1]的可能的数量($array[1]为第一个数)。这样数组个数一个个地减少
 楼主| 发表于 2011-3-15 13:41:05 | 显示全部楼层
本帖最后由 foboy 于 2011-3-15 14:43 编辑

回复 2# happytc


   楼上朋友如果有意参与就请贴代码,不要只是贴点理论纸上谈兵。

因为即使思路相同,代码也会千变万化。
发表于 2011-3-15 13:43:24 | 显示全部楼层
条件限得很死,试一下.
#include <array.au3>

Global $g_array[5]
For $i = 0 To 4
        $g_array[$i] = Random(1, 10, 1)
Next
        
$fin=ten($g_array)
msgbox(0,0,$fin)

func ten($array)
        $arraycombinations=_ArrayCombinations($array,3,"+")
        for $i=1 to $arraycombinations[0]                
                if IsInt(Execute($arraycombinations[$i])/10) then return $arraycombinations[$i]
        Next
        Return "未找到符合"
EndFunc
发表于 2011-3-15 13:43:57 | 显示全部楼层
没有精力帮你完全完成了,方法已经说了。
 楼主| 发表于 2011-3-15 14:33:40 | 显示全部楼层
回复 4# 3mile

调用100次此函数的平均时间:0.428594057951979
游客,如果您要查看本帖隐藏内容请回复
发表于 2011-3-15 14:37:39 | 显示全部楼层
进来学习一下
发表于 2011-3-15 15:46:48 | 显示全部楼层
回复 6# foboy
再试试这个
Global $g_array[5]
global $time=TimerInit()
for $k=1 to 100
        For $i = 0 To 4
                $g_array[$i] = Random(1, 10, 1)
        Next
        $fin=ten($g_array)        
Next

func ten($array)
        for $a=0 to 2
                for $b=$a+1 to 3                        
                        for $c=$b+1 to 4
                                if mod($array[$a]+$array[$b]+$array[$c],10)=0 then Return $array[$a]&","&$array[$b]&","&$array[$c]
                        Next                        
                Next
        Next
        return 0
EndFunc
 楼主| 发表于 2011-3-15 16:16:28 | 显示全部楼层
回复 8# 3mile

100次的平均时间:0.0229276925058093
这个应该是最高效的。
游客,如果您要查看本帖隐藏内容请回复
发表于 2011-3-18 23:21:24 | 显示全部楼层
3M的算法无可厚非,
但是楼主不知道在遮遮掩掩什么,棋牌类游戏有个特点,那就是相同的牌是有个数限制的,你也不说明白你要的函数具体实现哪个部分,就叫人写。你就不怕别人写的不是你要的么?如果只是要算法,大可不必拿棋牌游戏说事!
发表于 2011-3-19 00:24:08 | 显示全部楼层
怎么都没安要求返回“下标”?
发表于 2011-4-2 23:10:02 | 显示全部楼层
看看啊,凑字看
发表于 2011-4-3 09:53:47 | 显示全部楼层
受教了~!!!
发表于 2011-4-5 22:13:57 | 显示全部楼层
回複看一下
发表于 2011-4-6 07:32:33 | 显示全部楼层
回复 10# love5173


    说老实话,我连题目的意图都没看明白
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 09:57 , Processed in 0.098155 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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