4

扑克中的双槽是指你有 2 次直接击球。

例如,如果公共牌是 268,而您有 45,则 3 (23456) 或 7 (45678) 将为您完成顺子。

给定 board[] 和 hand[],如果你有双装订线,那么返回 true 并且没有返回 false 的有效算法是什么?

4

3 回答 3

1

这是一个可以用位向量做到这一点的算法。

首先,创建一个 14 位的位向量,比如说(包括低位和高位 ace)并为和cards中的每个元素设置每个位。hand[]board[]

(mask, gutter)接下来,为第一个元素生成 5 对掩码,hand[]这样((cards & mask) ^ gutter)==0如果您有双装订线。例如,如果您的一张牌是7,则(mask, gutter)对将是(假设 MSB->LSB 顺序):

01111111000000, 01011101000000
00000001111111, 00000001011101
00000111111100, 00000101110100
00001111111000, 00001011101000
00011111110000, 00010111010000

即,您有 2 个双槽,两端有 7 个,中间有 3 个,中间有 7 个。

现在,计算((cards & mask) ^ gutter)5 对中的每一对。如果有的话,0你有一个双排水沟。

编辑:原来你只需要测试 5 个面具。

于 2013-01-28T04:14:15.977 回答
0

我猜:

  1. 为每个卡值创建一个布尔数组(或位字段)
  2. 对于 board[] 和 hand[] 中的每张牌,将相应的条目设置为 true
  3. 检查顺子的所有可能性;由于您不关心颜色,因此选项非常有限(即 23456、34567 等) - 如果可能的顺子中恰好缺少一张牌,请将其添加到一组(不能包含重复)。
  4. 如果集合恰好包含 2 个条目,则返回 true。

或者,对尚未出现在棋盘上的任何值进行一次实验,检查是否有顺子,如果添加该值并计算发生这种情况的值。

所有的算法都是常数时间(因为整个情况是有限的),它们并不需要付出很大的努力。

于 2013-01-28T04:07:12.777 回答
0

这是我使用按位运算的方法:

vec = 0

映射hand[]board[]数字的位vec,然后

gutter = 0
for i = 0 to 10
    x = (vec & 0x1f) ^ 0x1f
    if x one of 1,2,4,8,16
        gutter++
        if gutter >= 2
            return true
    vec = vec >> 1
return false
于 2013-01-28T17:12:28.310 回答