扑克中的双槽是指你有 2 次直接击球。
例如,如果公共牌是 268,而您有 45,则 3 (23456) 或 7 (45678) 将为您完成顺子。
给定 board[] 和 hand[],如果你有双装订线,那么返回 true 并且没有返回 false 的有效算法是什么?
扑克中的双槽是指你有 2 次直接击球。
例如,如果公共牌是 268,而您有 45,则 3 (23456) 或 7 (45678) 将为您完成顺子。
给定 board[] 和 hand[],如果你有双装订线,那么返回 true 并且没有返回 false 的有效算法是什么?
这是一个可以用位向量做到这一点的算法。
首先,创建一个 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 个面具。
我猜:
或者,对尚未出现在棋盘上的任何值进行一次实验,检查是否有顺子,如果添加该值并计算发生这种情况的值。
所有的算法都是常数时间(因为整个情况是有限的),它们并不需要付出很大的努力。
这是我使用按位运算的方法:
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