扑克中双排水沟检测算法

时间:2013-01-28 03:51:05

标签: algorithm

扑克中的双排水槽就是当你有两次直线射门时。

例如,如果棋盘是268而你有45,那么3(23456)或7(45678)将为你完成直道。

鉴于board []和hand [],如果你有一个双排水沟,那么返回true的有效算法是什么?如果不是,则返回false?

3 个答案:

答案 0 :(得分:1)

这是一个可以用位向量执行此操作的算法。

首先,创建一个14位的位向量,比如cards(包括低和高的ace),并为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

即,你有两个双排水沟,两端各有7个,中间有7个。

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

编辑:事实证明你只需要测试5个面具。

答案 1 :(得分:0)

我的猜测:

  1. 为每个卡值创建一个bool数组(或位字段)
  2. 对于board []和hand []中的每张卡,将相应的条目设置为true
  3. 检查直线的所有可能性;因为你不关心颜色,选项是非常有限的(即23456,34567等) - 如果可能的直线中只缺少一张卡,则将其添加到一组(不能包含重复)。
  4. 如果该集合恰好包含2个条目,则返回true。
  5. 或者,对一个尚未登上任何值的实验进行一次实验,检查你是否有一个直的,如果你添加该值并计算发生这种情况的值。

    所有算法都是恒定时间(因为整个情况都是有限的),并且他们不需要花费太多精力。

答案 2 :(得分: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