如何以一种优雅高效的方式为N<16卡找到所有可能的扑克手?
(N=6):啊,广告,2h,3h,4h,5s
所有(22+)扑克手: AhAd,Ad2h3h4h5s,Ah2h3h4h5s
定期查找似乎不是一个选择,但我仍然希望它是非常快。什么是最有效的卡表示(64位或int[],或.)为了这个问题?
上下文:
我正在尝试在开放的中国中实现C++扑克,这很容易。
有一种奖金游戏叫做“幻想之地”,你可以时不时地玩。
一次得到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)?
发布于 2015-08-26 05:26:34
我确实做过这个练习,是的,暴力是唯一的方法。在好的一面,你可以修剪搜索空间的很大一部分,通过观察,这只手不能被犯规。
最简单的方法是使用嵌套的组合生成器。例如,如果您正在考虑使用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)在这一点上,由你来决定如何处理这个度量。你可以把所有的手机都保存在内存中,甚至大多数手机都应该有足够的内存。该循环产生的值应该少于一百万,您可以对其进行排序、筛选、切片或骰子。
真正的工作是想出一个评价函数,它能很好地估计出手的价值。版税点是一个很好的起点,但你还需要更多。
https://stackoverflow.com/questions/31575577
复制相似问题