本题目要求对读入的五张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;
}