斗地主之顺子

【编程 | 200分】 斗地主之顺子


题目描述:

  • 在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,

  • 玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。

  • 其中顺子的出牌规则为:由 至少 5 张由小到大连续递增 的扑克牌组成,且 不能包含 2

  • 例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;

  • 而{J,Q,K,A,2}、 {2,3,4,5,6}、{3,4,5,6}、{3,4,5,6,8}等都不是顺子。

  • 给定一个包含13张牌的数组,如果有满足出牌规则的顺子,请输出顺子。

  • 如果存在多个顺子,请每行输出一个顺子,且需要按顺子的 第一张牌的大小(必须从小到大) 依次输出。

  • 如果没有满足出牌规则的顺子,请 输出 No


输入描述:

13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王:

1
29J 234K A 79A 56

不需要考虑输入为异常字符的情况

输出描述:

组成的顺子,每张扑克牌数字用空格隔开:

1
34567

示例1:

输入

1
29J 234K A 79A 56

输出

1
34567

说明

13张牌中,可以组成的顺子只有1组:3 4 5 6 7

示例2:

输入

1
29J 1034K A 7Q A 56

输出

1
2
34567
910J Q K A

说明

13张牌中,可以组成2组顺子,从小到大分别为:3 4 5 6 7 和 9 10 J Q K A

示例3:

输入

1
299934K A 10Q A 56

输出

1
No

说明

13张牌中,无法组成顺子


注意:

特殊输入

1
3344556677889

对应输出

1
2
345678
3456789

运行结果

alt

测试结果

alt


通过率:100%


参考代码

#include<bits/stdc++.h>
 
using namespace std;
 
typedef std::uint64_t hash_t;
 
constexpr hash_t prime = 0x100000001B3ull;
constexpr hash_t basis = 0xCBF29CE484222325ull;
 
class Poker {
public:
    int currLastValue{};
    vector<int> allData;
    ~Poker() = default;
};
 
void SplitString(string input, vector <string> &output, string pattern)
{
    string::size_type pos;
    input += pattern;
    for (int i = 0; i < input.size(); i++) {
        pos = input.find(pattern, i);
        if (pos < input.size()) {
            string temp = input.substr(i, pos - i);
            if ((temp != pattern) && (!temp.empty())) {
                output.push_back(temp);
            }
            i = pos + pattern.size() - 1;
        }
    }
}
 
int getIntegerValue(char poker)
{
    switch (poker) {
        case 'J':
            return 11;
        case 'Q':
            return 12;
        case 'K':
            return 13;
        case 'A':
            return 14;
        default:
            return poker - '0';
    }
}
 
string getStringValue(int poker)
{
    switch (poker) {
        case 11:
            return "J";
        case 12:
            return "Q";
        case 13:
            return "K";
        case 14:
            return "A";
        default:
            return to_string(poker);
    }
}
 
int main(int argc, char **argv)
{
    string str;
    getline(cin, str);
    vector <string> out;
    SplitString(str, out, " ");
 
    vector<int> ACE;
    for (int i = 0; i < out.size(); i++) {
        if (out[i] == "10") {
            ACE.push_back(stoi(out[i]));
        } else if (out[i] != "2" && out[i] != "10") {
            ACE.push_back(getIntegerValue(out[i][0]));
        }
    }
 
    sort(ACE.begin(), ACE.end());
 
    queue<int> Q;
    for (int x: ACE) Q.push(x);
 
    vector <Poker*> allSortedList;
    int lastValue = 0;
     
    while (!Q.empty())
    {
        int currentValue = Q.front();
        Q.pop();
        if (lastValue == 0) {
            Poker *poker = new Poker;
            poker->currLastValue = currentValue;
            vector<int> tempData;
            tempData.push_back(currentValue);
            poker->allData = tempData;
            allSortedList.push_back(poker);
        } else {
            if (currentValue - lastValue == 0) {
                bool isAdded = false;
                for (auto &poker: allSortedList) {
                    if (currentValue - poker->currLastValue == 1) {
                        poker->currLastValue = currentValue;
                        poker->allData.push_back(currentValue);
                        isAdded = true;
                        break;
                    }
                }
                if (!isAdded) {
                    Poker *poker = new Poker;
                    poker->currLastValue = currentValue;
                    vector<int> allData;
                    allData.push_back(currentValue);
                    poker->allData = allData;
                    allSortedList.push_back(poker);
                }
            } else if (currentValue - lastValue == 1) {
                for (Poker *poker: allSortedList) {
                    if (poker->currLastValue == lastValue) {
                        poker->currLastValue = currentValue;
                        poker->allData.push_back(currentValue);
                        break;
                    }
                }
            } else {
                Poker *poker = new Poker;
                poker->currLastValue = currentValue;
                vector<int> allData;
                allData.push_back(currentValue);
                poker->allData = allData;
                allSortedList.push_back(poker);
            }
        }
        lastValue = currentValue;
    }
     
    sort(allSortedList.begin(), allSortedList.end(), [](Poker* Poker1, Poker* Poker2){
        return Poker1->allData.size() < Poker2->allData.size();
    });
     
    int counter = 0;
    for (Poker *poker: allSortedList)
    {
        if (poker->allData.size() >= 5) {
            for (int i = 0; i < poker->allData.size(); i++) {
                cout << getStringValue(poker->allData[i]);
                if (i != poker->allData.size() - 1) cout << " ";
            }
            cout << endl;
            counter++;
        }
    }
     
    if(counter == 0)
        cout << "NO" << endl;
         
    return 0;
}



#华为机试##笔试题目#
全部评论
看的云里雾里,膜拜大佬
点赞 回复 分享
发布于 2024-02-14 22:00 山西
3344556677889,这个为什么是两个输出
点赞 回复 分享
发布于 2023-08-19 16:55 山东
有没有python版的大佬啊,卡在最后一个用例了
点赞 回复 分享
发布于 2022-08-21 20:38 陕西
有时候感觉编程也挺有意思的
点赞 回复 分享
发布于 2022-03-28 15:34

相关推荐

AAA专业长城贴瓷砖刘大爷:这样的简历我会直接丢进垃圾桶,花里胡哨的
点赞 评论 收藏
分享
评论
1
25
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务