挺绕的,不想怎么解释,就是字符串的运用,代码参考
【问题描述】
牌只有1到9,手里拿着已经排好序的牌a,对方出牌b,用程序判断手中牌是否能够压过对方出牌。
规则:出牌牌型有5种
[1]一张 如4 则5…9可压过
[2]两张 如44 则55,66,77,…,99可压过
[3]三张 如444 规则如[2]
[4]四张 如4444 规则如[2]
[5]五张 牌型只有12345 23456 34567 45678 56789五个,后面的比前面的均大。
【输入形式】
输入有多行,第一行代表手中的牌,长度不超过200个数字。接下来的每一行代表每次对方出的牌。
【输出形式】
输出有多行,代表手中的牌是否能压过对方出的牌,压过输出YES, 并列出所有可选项,可选项之间用空格分隔。 否则输出NO。
【样例输入】
17624234556367
33
222
34567
【样例输出】
YES 44 55 66 77
YES 666
NO
#include <algorithm>
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<char, int> mymap;
char ch[200] = {NULL};
cin >> ch;
int ch_length = 0;
for (int i = 0; i < 200; i++)
{
if (ch[i] != NULL)
{
ch_length++;
}
}
// cout << ch_length;
sort(ch, ch + ch_length);
// cout << ch;
for (int i = 0; i < ch_length; i++)
{
if (mymap.find(ch[i]) == mymap.end())
{
mymap[ch[i]] = 1;
}
else
{
mymap[ch[i]]++;
}
}
string s;
while (cin >> s)
{
string result = "";
if (s.size() != 5)
{
for (auto it = mymap.begin(); it != mymap.end(); it++)
{
if (it->first > s[0] && it->second >= s.size())
{
if (result == "")
{
result = "YES ";
for (int i = 0; i < s.size(); i++)
{
result += it->first;
}
}
else
{
result += " ";
for (int i = 0; i < s.size(); i++)
{
result += it->first;
}
}
}
}
if (result == "")
{
result = "NO";
}
cout << result << endl;
}
else
{
for (int i = s[0] - '0' + 1; i <= 5; i++)
{
for (auto it = mymap.begin(); it != mymap.end(); it++)
{
if (it->first - '0' < i || it->first-'0' > 5)
continue;
int j;
for (j = i; j <= i + 4; j++)
{
if (it->first - '0' != j)
break;
it++;
}
if (j == i + 5)
{
if (result == "")
{
result = "YES ";
for (int k = i; k < i + 5; k++)
{
result += to_string(k);
}
}
else
{
result += " ";
for (int k = i; k < i + 5; k++)
{
result += to_string(k);
}
}
}
}
}
if (result == "")
{
result = "NO";
}
cout << result<<endl;
}
}
return 0;
}