打牌

【问题描述】

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

#include<iostream>
#include<string>
using namespace std;
int main() {
    string a,b,a1;
    cin>>a;
    int i,j,k,n,t,lenth;
    char temp,k1;
    n=a.size();
    for(i=0; i<n-1; i++) {
        for(j=0; j<n-1-i; j++) {
            if(a[j]>a[j+1]) {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    a1=a;//a1为顺子准备 
    for(i=1; i<a1.size(); i++) {
        if(a1[i]==a1[i-1]) {
            a1.erase(i,1);
            i--;
        }
    }
    while(cin>>b) {
        lenth=b.size();
        t=1;
        k=0;//标记 判断是否需要输出YES 
        k1=0;//标记 防止输出相同牌 
        if(lenth<5) {
            for(i=0; i<n; i++) {
                if(a[i]<=b[0]) continue;
                else if(lenth==1) t=1;
                else if(a[i]==a[i+1]) t++;
                else if(a[i]!=a[i+1]) t=1;
                if(t==lenth&&k1!=a[i]) {
                    if(k==0) {
                        cout<<"YES";
                        k=1;
                    }
                    cout<<' ';
                    while(t>0) {
                        cout<<a[i];
                        t--;
                    }
                    k1=a[i];
                    t=1; 
                }
            }
            if(k==0) cout<<"NO";
            cout<<endl;
        } else {
            for(i=0; i<a1.size(); i++) {
                if(a1[i]>b[0]) break;
            }
            for(;i<a1.size()-1;i++){
                if(a1[i+1]==a1[i]+1){
                    if(t==1) k=i;
                     t++;
                }
                else if(t<5) t=1;
            }
            if(t>=5){
                cout<<"YES ";
                for(i=0;i<=t-5;i++){
                    for(j=0;j<5;j++)
                    cout<<a1[k+j+i];
                    cout<<' ';
                }
                cout<<endl;
            }
            else cout<<"NO\n";
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值