扑克中的双排水槽就是当你有两次直线射门时。
例如,如果棋盘是268而你有45,那么3(23456)或7(45678)将为你完成直道。
鉴于board []和hand [],如果你有一个双排水沟,那么返回true的有效算法是什么?如果不是,则返回false?
答案 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)
我的猜测:
或者,对一个尚未登上任何值的实验进行一次实验,检查你是否有一个直的,如果你添加该值并计算发生这种情况的值。
所有算法都是恒定时间(因为整个情况都是有限的),并且他们不需要花费太多精力。
答案 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