牌只有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
前言:
这个方法重复代码在顺子部分重复代码很多,所以显得很繁琐,代码量大。没有大佬们写的简洁,懂的少,就只能写得繁琐了,凑活看看也行,有错望指正!
思路:
1.分为顺子和非顺子情况;
2.非顺子的情况:看对方要出的牌是几位,因为都是重复的,所以只要拿它的首位出来和现在自己手里的牌字符串的每一位进行比较,依次找,如果我们的大,因为牌数要和对方相等,所以用count()函数找出我们手里有多少这中数字的牌,要求大于等于对方出的牌数就可以了。满足的放进set中,理由是set有排序和不重复功能,避免重复。
3.顺子情况:我们首先把手里的牌用set处理一下,得到从小到大的1~9的数字,当然可能有缺,不是每一个数字都有,比如手里的牌是17624234556367,set处理后的1,2,3,4,5,6,7
我把这些单个数字变成long long int 长整型,1234567,然后再转换为字符串,目的就是能利用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;
}