湖南大学CCF实训3-4:打牌C++

这是一个关于使用C++程序解决扑克牌游戏策略的问题,程序需判断已排序的手牌是否能按照特定规则压制对方出的牌。输入包括手牌和对方出牌信息,输出是能否压制及具体压制选项。程序通过比较不同牌型,利用集合去重和查找功能实现判断逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

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

【AC代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string shou;
int main()
{
	cin>>shou;
	sort(shou.begin(),shou.end());
	int len_shou=shou.length();
	set<char> t;//用set去重 待会用于找顺子 
	for(int i=0;i<len_shou;i++){
		t.insert(shou[i]);
	}
	string b;
	while(cin>>b){
		int len=b.length();
		if(len==1){
			set<char> ans;//需要去重,可以想到使用set  
			for(int i=0;i<len_shou;i++){
				if(shou[i]>b[0]){
					ans.insert(shou[i]);
				}
			}
			if(ans.size()){
				cout<<"YES ";
				for(set<char>::iterator it=ans.begin();it!=ans.end();it++){
					cout<<*it<<" ";
				} 
				cout<<endl;
			}
			else{
				cout<<"NO"<<endl;
			}
		}
		else if(len==2){
			set<char> ans;//需要去重,可以想到使用set  
			for(int i=0;i<len_shou-1;i++){
				if(shou[i]>b[0]&&shou[i+1]==shou[i]){
					ans.insert(shou[i]);
				}
			}
			if(ans.size()){
				cout<<"YES ";
				for(set<char>::iterator it=ans.begin();it!=ans.end();it++){
					cout<<*it<<*it<<" ";
				} 
				cout<<endl;
			}
			else{
				cout<<"NO"<<endl;
			}
		}
		else if(len==3){
			set<char> ans;//需要去重,可以想到使用set  
			for(int i=0;i<len_shou-2;i++){
				if(shou[i]>b[0]&&shou[i+1]==shou[i]&&shou[i+2]==shou[i]){
					ans.insert(shou[i]);
				}
			}
			if(ans.size()){
				cout<<"YES ";
				for(set<char>::iterator it=ans.begin();it!=ans.end();it++){
					cout<<*it<<*it<<*it<<" ";
				} 
				cout<<endl;
			}
			else{
				cout<<"NO"<<endl;
			}
		}
		else if(len==4){
			set<char> ans;//需要去重,可以想到使用set  
			for(int i=0;i<len_shou-3;i++){
				if(shou[i]>b[0]&&shou[i+1]==shou[i]&&shou[i+2]==shou[i]&&shou[i+3]==shou[i]){
					ans.insert(shou[i]);
				}
			}
			if(ans.size()){
				cout<<"YES ";
				for(set<char>::iterator it=ans.begin();it!=ans.end();it++){
					cout<<*it<<*it<<*it<<*it<<" ";
				} 
				cout<<endl;
			}
			else{
				cout<<"NO"<<endl;
			}
		}
		else if(len==5){
			set<char> ans;//需要去重,可以想到使用set  
			//这一段写得属实难看 不太熟悉STL的容器指针的操作  
			for(set<char>::iterator it=t.begin();it!=t.end();it++){
				if(*it>b[0]){
					set<char>::iterator ip=it;
					ip++,ip++,ip++,ip++;
					if(*ip==*it+4) ans.insert(*it);
				}
			}
			if(ans.size()){
				cout<<"YES ";
				for(set<char>::iterator it=ans.begin();it!=ans.end();it++){
					cout<<char(*it)<<char(*it+1)<<char(*it+2)<<char(*it+3)<<char(*it+4)<<" ";
				} 
				cout<<endl;
			}
			else{
				cout<<"NO"<<endl;
			}
		}
	}
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Awars_zpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值