首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种高效的N卡可用手查找算法?(OFC幻想之地)

一种高效的N卡可用手查找算法?(OFC幻想之地)
EN

Stack Overflow用户
提问于 2015-07-22 23:12:35
回答 1查看 433关注 0票数 1

如何以一种优雅高效的方式为N<16卡找到所有可能的扑克手?

(N=6):啊,广告,2h,3h,4h,5s

所有(22+)扑克手: AhAd,Ad2h3h4h5s,Ah2h3h4h5s

定期查找似乎不是一个选择,但我仍然希望它是非常快。什么是最有效的卡表示(64位或int[],或.)为了这个问题?

上下文:

我正在尝试在开放的中国中实现C++扑克,这很容易。

有一种奖金游戏叫做“幻想之地”,你可以时不时地玩。

一次得到13张、14张或15张。这个游戏对于人类玩家来说是微不足道的“解决”,所以我想让游戏引擎建议一个可能的游戏。最好的游戏是(+/-)加分最多的那出戏。

很容易实现,但为了教育目的,我想找到一个优雅的解决这个问题的方法。

暴力解决方案:

代码语言:javascript
复制
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)?

EN

回答 1

Stack Overflow用户

发布于 2015-08-26 05:26:34

我确实做过这个练习,是的,暴力是唯一的方法。在好的一面,你可以修剪搜索空间的很大一部分,通过观察,这只手不能被犯规。

最简单的方法是使用嵌套的组合生成器。例如,如果您正在考虑使用14张卡,您可能会执行以下操作:

代码语言:javascript
复制
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)

在这一点上,由你来决定如何处理这个度量。你可以把所有的手机都保存在内存中,甚至大多数手机都应该有足够的内存。该循环产生的值应该少于一百万,您可以对其进行排序、筛选、切片或骰子。

真正的工作是想出一个评价函数,它能很好地估计出手的价值。版税点是一个很好的起点,但你还需要更多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31575577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档