卡片算法游戏

时间:2015-12-14 00:11:16

标签: algorithm graph game-theory

我正在玩下面的问题并采用暴力方法,但无法提出一个很好的解决方案。问题如下:

有2张N卡。你和你的对手将它们分开(N卡给你,N给他们)。你确切地知道他们拥有什么牌以及他们将以什么顺序出场。

游戏规则如下:对于前N / 2轮,​​具有最高卡的人获胜并且在最后N / 2轮中,具有最低卡的人获胜。

鉴于这些规则和你的对手在那里打牌的顺序,你可以获得的最大胜利数量是多少。

示例:

你有卡牌:2,5,6,7。 你的对手有牌:1,8,4,3并按顺序播放。

你可以得到的最高得分是2,因为你打7比1,输掉第2轮和第3轮,然后在最后一轮打2赢。

我的想法:将你的牌分成两堆,你的号码较大,编号较小。然后找出最佳匹配。

非常感谢伪代码/算法的想法。

编辑:共有N轮。前N / 2轮:较高的牌获胜。最后N / 2轮:较低的牌获胜。 N必须是均匀的。

2 个答案:

答案 0 :(得分:2)

我建议:

  • 将您的卡片分成两堆/更高
  • 对它们进行排序
  • 按价值(第一轮)排列更大的对手牌
  • 从最大到较低的对手牌:
    如果你的剩余最大值低于对手牌,则打最低牌(丢失)
    否则打出你的最高牌(赢)

类似于 lower 桩,反转订单

答案 1 :(得分:1)

首先,创建一个包含N个项目的数组(每轮一个)。每个项目都是"获胜卡片的列表"对于那一轮,即你赢得那一轮的那套牌。在您的示例中,您获得{{2567},{},{2},{2}}

以下列表列出了一些卡应该被分配的情况"一轮。这意味着我们决定在那一轮比赛中打出那张牌,之后什么都不会改变。在分配了一张牌之后,该算法应该在从一组回合中移除分配的回合以及从任何回合的获胜卡组中分配的牌后继续。

显而易见的是,在任何情况下应用任何这些规则都不会减少可能获胜的数量,因此在开始蛮力之前尽可能多地应用它们总是一个好主意。

  • 如果C卡可以赢得R轮,而C卡不能赢得其他轮次,则将卡C分配给R轮。
  • 如果C卡无法在任何一轮中获胜,并且任何一张牌都无法获得R轮,则将卡C分配给R轮。
  • 如果C卡可以在前N / 2轮的某些比赛中获胜,但是C卡在最后N / 2轮的任何一轮中都不会获胜,并且卡C是具有此属性的卡中最高的,将卡C分配给胜利的最困难的一轮(即卡C赢得的对手卡中最高的一张)。
  • 如果C卡可以在最后一轮N / 2轮比赛中获胜,但是C卡在前N / 2轮中的任何一轮都不会获胜,而C卡是拥有此属性的卡中最低的,将卡C分配给胜利的最困难的一轮(即卡C赢得的对手卡中最低的一张)。

请注意,将牌分配给一轮可以更改每轮中获胜的牌和牌,因此即使其中一条规则不适用,也可以在应用其他规则后适用。所以必须迭代地尝试它们,直到对它们进行完全迭代才会产生新的赋值。

这不是一个明确的解决方案,但它肯定会让最后的暴力步骤更容易。