2025年ccf练习-打牌

ccf练习-打牌牌只有 1 到 9 手里拿着已经排好序的牌 a 对方出牌 b 用程序判断手中牌是否能够压过对方出牌 规则 出牌牌型有 5 种 1 一张 如 4 则 5 9 可压过 2 两张 如 44 则 55 66 77 99 可压过 3 三张 如 444 规则如 2 4 四张 如 4444 规则如 2

大家好,我是讯享网,很高兴认识大家。

牌只有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。

【样例输入】

367 33 222 34567

讯享网

【样例输出】

讯享网YES 44 55 66 77 YES 666 NO

前言:

这个方法重复代码在顺子部分重复代码很多,所以显得很繁琐,代码量大。没有大佬们写的简洁,懂的少,就只能写得繁琐了,凑活看看也行,有错望指正!

思路:


讯享网

1.分为顺子和非顺子情况;

2.非顺子的情况:看对方要出的牌是几位,因为都是重复的,所以只要拿它的首位出来和现在自己手里的牌字符串的每一位进行比较,依次找,如果我们的大,因为牌数要和对方相等,所以用count()函数找出我们手里有多少这中数字的牌,要求大于等于对方出的牌数就可以了。满足的放进set中,理由是set有排序和不重复功能,避免重复。

3.顺子情况:我们首先把手里的牌用set处理一下,得到从小到大的1~9的数字,当然可能有缺,不是每一个数字都有,比如手里的牌是367,set处理后的1,2,3,4,5,6,7

我把这些单个数字变成long long int 长整型,,然后再转换为字符串,目的就是能利用find函数快速查找某些顺子是否有。

12345 就要找23456     34567    45678     56789

23456就要找34567    45678     56789

34567就要找45678     56789

45678就要找56789

56789不可能有牌可以压了,不用找了,直接NO了。

#include <iostream> #include<bits/stdc++.h> using namespace std; int main() { string str,str1; cin>>str; while(cin>>str1){ if(str1.length()<5){//非顺子情况 int flag=0; set<int>qu; for(int i=0;i<str.length();i++){ if(str[i]>str1[0]){ int ncount=count(str.begin(),str.end(),str[i]); if(ncount>=str1.length()){//含有某个数字的个数是否大于等于str1的长度; int temp=str[i]-'0'; int sum=0; for(int i=0;i<str1.length();i++){ sum+=temp*pow(10,i);//转换为int数据,比如33;33=3*pow(3,0)+pow(3,1); } qu.insert(sum); flag=1; } } } if(flag==0) cout<<"NO"<<endl; else{ cout<<"YES"<<" "; set<int>::iterator it; for(it=qu.begin();it!=qu.end();it++) cout<<*it<<" "; } cout<<endl; } else{//顺子的情况 string s; stringstream ss; int num=0; set<int>qu; long long int sum=0; for(int i=0;i<str.length();i++){ qu.insert(str[i]-'0');//set有排序功能而且不重复,所以可以很好的统计str中1~9中的那些数字, } //而且还是按顺序的,方便转换成string类型的数据;从而应用find函数 set<int>::iterator it; int i; for(it=qu.begin(),i=qu.size()-1;it!=qu.end(),i>=0;it++,i--){ sum+=(*it)*pow(10,i);//转化为长整型数据有利于把他变成字符串 } ss<<sum; ss>>s; if(str1=="12345"){ if(s.find("23456")==-1&&s.find("34567")==-1&&s.find("45678")==-1&&s.find("56789")==-1) cout<<"NO"<<endl; else { cout<<"YES"<<" "; if(s.find("23456")!=-1) cout<<"23456"<<" "; if(s.find("34567")!=-1) cout<<"34567"<<" "; if(s.find("45678")!=-1) cout<<"45678"<<" "; if(s.find("56789")!=-1) cout<<"56789"<<" "; } cout<<endl; } if(str1=="23456"){ if(s.find("34567")==-1&&s.find("45678")==-1&&s.find("56789")==-1) cout<<"NO"<<endl; else{ cout<<"YES"<<" "; if(s.find("34567")!=-1) cout<<"34567"<<" "; if(s.find("45678")!=-1) cout<<"45678"<<" "; if(s.find("56789")!=-1) cout<<"56789"<<" "; } cout<<endl; } if(str1=="34567"){ if(s.find("45678")==-1&&s.find("56789")==-1) cout<<"NO"<<endl; else{ cout<<"YES"<<" "; if(s.find("45678")!=-1) cout<<"45678"<<" "; if(s.find("56789")!=-1) cout<<"56789"<<" "; } cout<<endl; } if(str1=="45678"){ if(s.find("56789")==-1) cout<<"NO"<<endl; else{ cout<<"YES"<<" "; if(s.find("56789")!=-1) cout<<"56789"<<" "; } cout<<endl; } if(str1=="56789") cout<<"NO"<<endl; } } return 0; }

小讯
上一篇 2025-02-18 09:10
下一篇 2025-03-29 18:13

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67820.html