ccf练习-打牌

牌只有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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值