[算法]判断5张牌能否组成顺子 考虑A作为14的情况 C++

        从若干副扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13;而大、小王为0,可以看成任意牌。另外,"10,J(11),Q(12),K(13),A(1)"也是顺子。

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

bool isStraight(std::vector<int>& nums) {
    std::set<int> uniqueCards; // 用于存储唯一的牌值
    // 情况1的最小值和最大值 情况2的最小值和最大值(用于A作为14的情况)
    int minVal, maxVal,SecondMaxVal=14,SecondMinVal=0; 
    int wildcards = 0; // 计数大小王数量
    
    // 将牌值填入集合中,同时统计大小王的数量
    for (int num : nums) {
        if (num == 0) { // 若为大小王则统计
            wildcards++;
        } 
        else {
            uniqueCards.insert(num);
        }
    }
    // 若大小王数量为 5,则可以组成顺子
    if(wildcards==5)   return true;
    //计算最大值和最小值
    minVal = *uniqueCards.begin();
    maxVal = *uniqueCards.rbegin();
    // 若存在A且A不是唯一牌,则将A作为14的情况 需要求新的最小值
    if(uniqueCards.find(1)!= uniqueCards.end()&&uniqueCards.size()>1)
        SecondMinVal =*(++uniqueCards.begin());
    // 如果唯一牌数量+大小王数量小于 5,则不可能形成顺子
    if (uniqueCards.size() + wildcards < 5) {
        return false;
    }
    // 如果最大值与最小值的差值超过 5,则不可能形成顺子(并考虑A作为14的情况)
    return (maxVal - minVal < 5||SecondMaxVal-SecondMinVal<5);
}

int main() {
    std::vector<int> cards = {0, 0, 0, 1, 13}; // 例子牌值
    if (isStraight(cards)) {
        std::cout << "这5张牌可以组成顺子。" << std::endl;
    } else {
        std::cout << "这5张牌不能组成顺子。" << std::endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值