是不是顺子 (25分)

本题目要求对读入的五张Poker牌进行判断:它是否是一个正常的顺子。 说明:34567890JQKA2wW相信大家知道一二,为简化操作,0代表10,w和W代表小王和大王,大,小王可代替任意的牌哟。编程判断输入的五张牌是否会构成一个顺子(方案多个时,输出较大的,34567和0JQKA分别是最小和最大的顺子)
输入格式:

输入用五个字符代表的五张牌,系统确保输入的数据无误,但并不一定是有序排列。
输出格式:

输出这五张牌组成的顺子或输出空表示不是顺子,注意大小王可当任意的牌使用,输出的顺子要求是最大的一个,且升序排列(如果有的话)。
输入样例1:

A0KJw

输出样例1:

[0JQKA]

输入样例2:

A3452

输出样例2:

[]

不要忘掉考虑大小王有剩余的情况

//
// Created by TIGA_HUANG on 2020/10/6.
//

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

struct node {
    
    
    char c;
    int value;

    bool operator<(node &x) const {
    
    
        return value < x.value;
    }
};

vector<node> v;

int main() {
    
    
    map<char, int> mp;
    mp['3'] = 3;
    mp['4'] = 4;
    mp['5'] = 5;
    mp['6'] = 6;
    mp['7'] = 7;
    mp['8'] = 8;
    mp['9'] = 9;
    mp['0'] = 10;
    mp['J'] = 11;
    mp['Q'] = 12;
    mp['K'] = 13;
    mp['A'] = 14;
    mp['2'] = 15;
    string str;
    cin >> str;
    int King = 0;
    for (int i = 0; str[i]; ++i) {
    
    
        if (str[i] != 'w' && str[i] != 'W')
            v.push_back({
    
    str[i], mp[str[i]]});
        else {
    
    
            King++;
        }
    }
    sort(v.begin(), v.end());
    string ans;
    int preValue = v[0].value;
    ans += v[0].c;
    for (int j = 1; j < v.size(); ++j) {
    
    
        if (v[j].value - preValue != 1) {
    
    
            if (King == 0) {
    
    
                cout << "[]";
                return 0;
            } else {
    
    
                for (auto it = mp.begin(); it != mp.end(); ++it) {
    
    
                    if (it->second == preValue + 1) {
    
    
                        ans += it->first;
                        ans += v[j].c;
                        preValue = v[j].value;
                        break;
                    }
                }
                King--;
            }
        } else {
    
    
            ans += v[j].c;
            preValue = v[j].value;
        }
    }
    while (King) {
    
    
        for (auto it = mp.begin(); it != mp.end(); ++it) {
    
    
            if (it->second == preValue + 1) {
    
    
                ans += it->first;
                preValue = it -> second;
                break;
            }
        }
        King--;
    }
    if (ans.length() < 5) {
    
    
        cout << "[]";
        return 0;
    }
    cout << '[';
    for (int k = 0; k < 5; ++k) {
    
    
        cout << ans[ans.length() - 5 + k];
    }
    cout << ']';
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44378358/article/details/108941969