HNU软件能力实训3-4. 打牌

本文介绍了一种使用C++和map解决打牌游戏策略的问题,包括接收和存储牌的数据结构,判断是否能压过对方出牌的逻辑,特别是针对非顺子和顺子情况的处理。通过示例输入和输出展示了解题思路和AC代码。
摘要由CSDN通过智能技术生成

写在前面

你好!欢迎来到我的博客,希望我的思路能够帮到你!

问题描述

牌只有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
这段引用是一段C++代码,实现了两个多项式的加法。代码首先定义了一个cmp函数,用于比较两个数对的第一个数(多项式的次数)的大小。然后通过vector容器分别存储了两组数对。接下来使用迭代器遍历第一个vector容器中的数对,并在第二个vector容器中查找相同次数的数对,若找到则将第一个数对的系数修改为第二个数对的系数,并从第二个vector容器中删除这个数对。最后,将第二个vector容器中剩余的数对添加到第一个vector容器中,并按照多项式次数的降序对其进行排序。最后,遍历第一个vector容器,按照指定格式输出结果数对。这段代码实现了多项式加法,并按降幂输出结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [实训三#3.12多项式加法](https://blog.csdn.net/qq_54256430/article/details/120049796)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [HNU软件能力实训3-12. 多项式加法](https://blog.csdn.net/Karltan/article/details/118714616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值