foboy 发表于 2011-3-15 12:59:24

求一算法

本帖最后由 foboy 于 2011-3-18 01:49 编辑

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

事先定义一个数组,里面的数字是随机的:
Global $g_array
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楼。

下面是我自己写的:
**** Hidden Message *****
调用100次此函数,算出来的平均时间:0.0437982418932512ms
**** Hidden Message *****

happytc 发表于 2011-3-15 13:37:06

用动态算法:调用自己本身来实现循环,先排除数组里的第一个数,其它的可能组合的数量 + 数组里所有数组合成5-$array的可能的数量($array为第一个数)。这样数组个数一个个地减少

foboy 发表于 2011-3-15 13:41:05

本帖最后由 foboy 于 2011-3-15 14:43 编辑

回复 2# happytc


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

因为即使思路相同,代码也会千变万化。

3mile 发表于 2011-3-15 13:43:24

条件限得很死,试一下.
#include <array.au3>

Global $g_array
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               
                if IsInt(Execute($arraycombinations[$i])/10) then return $arraycombinations[$i]
        Next
        Return "未找到符合"
EndFunc

happytc 发表于 2011-3-15 13:43:57

没有精力帮你完全完成了,方法已经说了。

foboy 发表于 2011-3-15 14:33:40

回复 4# 3mile

调用100次此函数的平均时间:0.428594057951979
**** Hidden Message *****

骗子 发表于 2011-3-15 14:37:39

进来学习一下

3mile 发表于 2011-3-15 15:46:48

回复 6# foboy
再试试这个
Global $g_array
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

foboy 发表于 2011-3-15 16:16:28

回复 8# 3mile

100次的平均时间:0.0229276925058093
这个应该是最高效的。
**** Hidden Message *****

love5173 发表于 2011-3-18 23:21:24

3M的算法无可厚非,
但是楼主不知道在遮遮掩掩什么,棋牌类游戏有个特点,那就是相同的牌是有个数限制的,你也不说明白你要的函数具体实现哪个部分,就叫人写。你就不怕别人写的不是你要的么?如果只是要算法,大可不必拿棋牌游戏说事!

Cygerist 发表于 2011-3-19 00:24:08

怎么都没安要求返回“下标”?

bakefish 发表于 2011-4-2 23:10:02

看看啊,凑字看

White 发表于 2011-4-3 09:53:47

受教了~!!!

zhongzijie 发表于 2011-4-5 22:13:57

回複看一下

netegg 发表于 2011-4-6 07:32:33

回复 10# love5173


    {:face (125):}说老实话,我连题目的意图都没看明白
页: [1] 2
查看完整版本: 求一算法