c - 我们如何有效地迭代卡片组合?

标签 c algorithm bitmap bit-manipulation poker

有大量的扑克牌可能。我们想通过移除相似的牌来减少这种情况,以便我们可以遍历每个可能的组合。

为了做到这一点,可能的组合由长度为 52 的字符串表示,其中“0”表示卡片不存在,“1”表示卡片存在。

所以手 2、3、4、5、6 颗红心将是:'0000000000000000000000000000000000000000000000011111'

2,4,10,红心 A 和梅花 3 将是: '0000000000000000000000000000000000000101000100000101'

等等……

这里前 13 位表示黑桃 A,K,Q,...4,3,2, 接下来的 13 位用于钻石 接下来的 13 个俱乐部 最后 13 个是红桃

现在我们需要做的是,从一个二进制字符串的十进制值,将其还原为类似扑克手牌的二进制字符串,并返回其十进制值

所以当我说相似的手时我是什么意思:- - 黑桃 A,Q,7,6,2 = 梅花 AQ762 = 红心 AQ762 = 方 block AQ762 所以它们的每一个二进制表示都可以化简为红心AQ762的二进制表示,是最小的 - 类似地,一手黑桃 2、3、4、5 和方 block A 相当于红心 A 和梅花 2、3、4、5,因此前者可以简化为后者。

AsKsQsJsTs = 1111100000000000000000000000000000000000000000000000
AcKcQcJcTc = 0000000000000000000000000011111000000000000000000000
AdKdQdJdTd = 0000000000000111110000000000000000000000000000000000
AhKhQhJhTh = 0000000000000000000000000000000000000001111100000000

Ac5s4s3s2s = 0000000001111000000000000010000000000000000000000000
Ah5c4c3c2c = 0000000000000000000000000000000000011111000000000000
Ac5d4d3d2d = 0000000000000000000000111100000000000001000000000000

但我知道:

AKQJTs == AKQJTc == AKQJTd == ... are same, because combination have same strength in poker, we can simplify suits
Ac5432s == Ah5432c == Ah5432d == ... are same

我认为我们可以对花色进行抽象:[1]、[2]、[3]、[4]

[1] - new first suit, suit of highest card
[2] - second suit if we are going down from highest card


65432[1] == 65432s == 65432c == 65432d == ..
6[1]5432[2] == 6c5432s == 6h5432c == 6c5432d == ..

最高牌的第一套是[1],下一套是[2]......

面具将是:

AKQJTs=AKQJTc=AKQJTd=AKQJTh = 0000000000000000000000000000000000000001111100000000 = 7936

Ah5432c=Ac5432d= ... = 0000000000000000000000000000000000011111000000000000 = 126976

我如何才能有效地进行这种掩码转换?

喜欢 - simplyfyMask(4362862139015168) = 7936 simplyfyMask(1040187392) = 126976

PS:如果我要使用另一个掩码:Aces - 0,1,2,3,Kings - 4,5,6,7,Jacks - 8,9,10,11 - 比特?

最佳答案

在您提供的示例中: simplyfyMask(1040187392) = 126976 您可以进一步减少:
来自 -0000000000000000000000000000000000011111000000000000
到 - - -0000000000000000000000000000000000000011000000001110
因为他们在扑克牌中的等级相同

这是一个 python 代码(希望这有帮助,我不是 C 程序员,所以没有用 C 语言回答)

def replaceByindex(string, index, value) :
    li = list(string)
    li[index] = value
    return ''.join(li)

def checkFlush(string) :
    for suit in range(4) :
        count = 0
        # print(suit,'-th suit check for flush')
        for card in range(13) :
            if string[suit*13 + card] != '0' :
                count += 1
        if count == 0 :
            continue
        elif count == 5 :
            # print('Flushed')
            return True
        else :
            # print(count,'cards counted for',suit,'-th suit')
            return False

def unFlushify(string) :
    if checkFlush(string) :
        for card in range(13) :
            index = 51 - card
            if string[index] == '2' :
                string = replaceByindex(string,index-13,'2')
                string = replaceByindex(string,index,'0')
                break
    return string

def  simplifyMask(num) :
    num = bin(num)
    num = num[2:]
    size = len(num)
    num = '0'*(52-size) + num
    # print(num, len(num))
    count = 0
    i = 0
    if not checkFlush(num) :
        while i<52 and count<5 :
            if num[i] == '1' :
                count += 1
                tgt_index = 39 + i%13
                updated = False
                while tgt_index>i and num[tgt_index] != '0' :
                    tgt_index -=13
                if tgt_index <= i :
                    num = replaceByindex(num,i,'2')
                else :
                    num = replaceByindex(num,i,'0')
                    num = replaceByindex(num,tgt_index,'2')
            i+=1
        num = unFlushify(num)
    else :
        while i<52 and count<5 :
            if num[i] == '1' :
                count+=1
                num = replaceByindex(num,i,'0')
                num = replaceByindex(num,39+i%13,'2')
    return num.replace('2','1')


num = int(input())
number = simplifyMask(num)
print(int(number,2),number)

我认为自己是编码方面的初学者,因此这可能不是最高效的一段代码,但这应该能让您了解如何继续。 :)

关于c - 我们如何有效地迭代卡片组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45856449/

相关文章:

android - 在安卓中使用opencv

将参数作为字符串调用不起作用 - C

c - 如何使用 fork() 创建一定数量的子进程

algorithm - 难以理解彼得森的算法

c++ - C++ 中的 KMP 算法实现给出运行时错误

android - Android崩溃:回收ImageView然后再次启动Activity

c - 二维动态数组,填充有复数

使用 glut 创建窗口,但程序不一致

php - 轻松计算和列出二进制组合

opengl - 使用GLUT位图字体