gpt4 book ai didi

algorithm - 一种高效的高效算法,可以找到 N 张牌的所有可能手牌? (OFC幻想世界)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:09 24 4
gpt4 key购买 nike

我如何才能优雅高效地找到 N<16 张牌的所有可能手牌?

例如:Ncards(N=6): Ah, Ad, 2h, 3h, 4h, 5s

所有(22+)手牌:AhAd、Ad2h3h4h5s、Ah2h3h4h5s

常规查找表似乎不是一个选项,但我仍然希望它非常快。对于这个问题,最有效的卡片表示法是什么(64 位或 int[],或...)?

上下文:

我正在尝试实现 open face chinese用 C++ 玩扑克牌,这很容易。

有一款名为 fantasyland 的奖励游戏,您可以时不时地玩一下。

您一次获得 13、14 或 15 张牌。这个奖励游戏对于人类玩家来说是微不足道的,所以我想让游戏引擎建议一个可能的玩法。最好的比赛将是 (+/-) 获得最多奖励积分的比赛。

很容易实现,但出于教育目的,我想找到一个优雅的解决方案来解决这个问题。

暴力破解:

1)find  $pokerhands=getAllPossiblePokerHands($cards) (contains overlapping combinations, eg AhAc and Ah2x3x4x5x)

2)for each $pokerhand:

- place the hand randomly on the board
- redefine $cards as the cards that you haven't placed on the board
- recursively repeat 1) and 2) untill the (13card board) board is
filled, than call getBoardRoyalties($finalboard). Store this board and
its points for later use.

After all combinations have been tried, find the board with highest value, this is the solution.

这个暴力解决方案似乎是解决这个问题的唯一方法?

由于 getBoardRoyalties() 是一个计算成本低的函数(查找表),并且可以优化迭代,剩下的唯一问题是:

如何优雅地实现 getAllPossiblePokerHands($cards)?

最佳答案

我实际上已经完成了这个练习,是的,蛮力是唯一的方法。从好的方面来说,您可以通过观察手牌不得被犯规来修剪大部分搜索空间。

最简单的方法是使用嵌套组合生成器。例如,如果您正在考虑 14 张卡片,您可能会这样做:

foreach front in C(14,3) possible front settings:
foreach middle in C(11,5) possible middle settings:
if middle fouls hand:
continue
foreach back in C(6,5) possible back settings:
if back fouls hand:
continue
metric = evaluate(front, middle, back)

此时,由您决定如何处理指标。您可以将所有这些都保存在内存中,即使大多数手机也应该有足够的内存。该循环应产生少于一百万个值,您可以对这些值进行排序、筛选、切片或切 block 。

真正的工作是提出一个评估函数,该函数可以很好地估计这手牌的值(value)。版税积分是一个很好的起点,但您需要的不止于此。

关于algorithm - 一种高效的高效算法,可以找到 N 张牌的所有可能手牌? (OFC幻想世界),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31575577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com