写在前面
你好!欢迎来到我的博客,希望我的思路能够帮到你!
问题描述
牌只有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
解题思路
这个题目,非常的有意思啊。(手动狗头)
然后初步审题之后,发现要判断牌的花色和牌数之间的关系,所以刚刚用完map的我决定继续用map。(手动绿色狗头)
先是接收数据,然后将其直接插入到map中,由于map中存储的是键值对,也就是pair<key,value>,而且value的值会随着key值被插入的次数而增长,这也是我为什么决定用map的原因。
然后就是根据对手出牌的不同,来判断我们是不是有压过对面的牌。这里我简单讲一下我是如何想到分类做的吧(其实就是开始忘记了发现错很多):对手如果出的不是顺子,那对于我们的每一种应对方案,都是只涉及到一个花色的,所以我们只需要记录满足条件的花色,直接push_back到vector中,然后全部push_back之后,直接sort,再根据对手出牌的个数n,对vector中的所有元素都循环输出n次即可。
以上是对手不出顺子的情况,接下来说对手出顺子的情况。
顺子的话,涉及到的就不是一个花色了,就是5个花色了,而且这五个花色必须是相邻的,但是对个数没有要求,有就行。所以我的想法是首先判断比对手大一个的顺子,大两个,…,大n个存不存在,若存在,则将这个顺子的开头pusn_back到vector中,然后排序,最后输出。
思路就是这样了,我们看代码吧。
小可爱们注意了,我用了map中一个独有的函数upper_bound(key),他的作用是返回大于key的第一个pair的迭代器,这样我们找顺子的时候就不用再去遍历寻找大于对手顺子的key了。
AC代码
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
int main()
{
map<char,int> m;
map<char,int>::iterator it;
vector<char> v;
vector<char