buctoj-2022寒假集训4

问题 B: 简单扑克牌游戏

题目描述

两个人玩简单扑克牌游戏,每人手里3张牌,每张牌的数字由19组成,花色包括ABCD四种,比较两手牌大小的规则由强到弱列举如下:
1、同花顺:3张牌花色相同,且数字连续,如1A 2A 3A , 如果两手牌都是同花顺,比较数字大小,数字大的赢
2、顺子:3张牌数字连续,但花色不同,如1A 2B 3C ,如果两手牌都是顺子,比较数字大小,数字大的赢
3、飞机:3张牌数字相同,如1A 1B 1C,如果两手牌都是飞机,比较数字大小,数字大的赢
4、同花:3张牌花色相同,如1A 3A 5A,如果两手牌都是同花,比较最大的数字大小,数字大的赢
5、对子:3张牌中有2张数字一样,如 1A 1B 2A,如果两手牌都是对子,则比较对子的数字大小,数字大的赢
5、杂牌:不满足上面的条件,如1A 5B 7C,如果两手牌都是杂牌,则比较最大的数字,大的赢

输入格式

输入包括多组测试数据,每组测试数据占一行,由6张牌组成,前三张牌属于zhangsan,后三张属于lisi

输出格式

对每组测试数据,判断输赢,如果zhangsan赢,输出zhangsan后换行,如果lisi赢,输出lisi后换行,如果平手输出tie后换行

输入样例 复制

1A 2A 3A 3B 4B 5B
1B 2A 3A 3C 6B 5B
5A 2A 3A 3B 3C 5B
2A 2B 3A 3B 3C 3D
1A 5A 7B 9B 1B 1B
1A 2A 5B 1A 3A 5C

输出样例 复制

lisi
zhangsan
zhangsan
lisi
lisi
tie

这道题说是简单扑克牌问题,确实很简单。
关键在于把最苛刻的条件放在最后,因为程序是由上而下执行的。

#include<iostream>
using namespace std;
struct puke{
	int n;
	char h;
}zs[3],ls[3]; //用了结构体来储存数据
int main(){
	int flag=-1; //判断谁赢,0张三,1李四,2平
	int t1,i;
	char t2;
	while(cin>>zs[0].n>>zs[0].h){
		for(i=1;i<3;i++){
			cin>>zs[i].n>>zs[i].h;
		} //读入张三的牌
		for(i=0;i<3;i++){
			cin>>ls[i].n>>ls[i].h;
		}//读入李四的牌
		if(zs[0].n>zs[1].n){ //对张三的牌从小到大排序
			t1=zs[0].n;
			zs[0].n=zs[1].n;
			zs[1].n=t1;
			t2=zs[0].h;
			zs[0].h=zs[1].h;
			zs[1].h=t2;
		}
		if(zs[1].n>zs[2].n){
			t1=zs[1].n;
			zs[1].n=zs[2].n;
			zs[2].n=t1;
			t2=zs[1].h;
			zs[1].h=zs[2].h;
			zs[2].h=t2;
		}
		if(zs[0].n>zs[1].n){
			t1=zs[0].n;
			zs[0].n=zs[1].n;
			zs[1].n=t1;
			t2=zs[0].h;
			zs[0].h=zs[1].h;
			zs[1].h=t2;
		}
		if(ls[0].n>ls[1].n){ //对李四的牌从小到大排序
			t1=ls[0].n;
			ls[0].n=ls[1].n;
			ls[1].n=t1;
			t2=ls[0].h;
			ls[0].h=ls[1].h;
			ls[1].h=t2;
		}
		if(ls[1].n>ls[2].n){
			t1=ls[1].n;
			ls[1].n=ls[2].n;
			ls[2].n=t1;
			t2=ls[1].h;
			ls[1].h=ls[2].h;
			ls[2].h=t2;
		}
		if(ls[0].n>ls[1].n){
			t1=ls[0].n;
			ls[0].n=ls[1].n;
			ls[1].n=t1;
			t2=ls[0].h;
			ls[0].h=ls[1].h;
			ls[1].h=t2;
		}
		
		if(zs[2].n>ls[2].n)flag=0;//默认都是杂牌比一下最大牌
		else if(zs[2].n<ls[2].n)flag=1;
		else if(zs[2].n==ls[2].n)flag=2;
		
		if(zs[0].n==zs[1].n||zs[1].n==zs[2].n){//如果张三是对子 
			if(ls[0].n==ls[1].n||ls[1].n==ls[2].n){//如果李四也是对子 
				if(zs[1].n>ls[1].n)flag=0;//比较
					else if(zs[1].n<ls[1].n)flag=1;
					else if(zs[1].n==ls[1].n)flag=2;
			}else flag=0;//如果张三是对子,李四不是对子,张三赢
		}else if((ls[0].n==ls[1].n||ls[1].n==ls[2].n)&&(zs[0].n!=zs[1].n&&zs[1].n!=zs[2].n)){
			flag=1;//如果李四是对子张三不是,李四赢
		} 
		
		if(zs[0].n==zs[1].n&&zs[1].n==zs[2].n){//张三是飞机
			if(ls[0].n==ls[1].n&&ls[1].n==ls[2].n){//如果李四也是飞机,比较
				if(zs[2].n>ls[2].n)flag=0;
					else if(zs[2].n<ls[2].n)flag=1;
					else if(zs[2].n==ls[2].n)flag=2;
			}else{//如果李四不是飞机,张三赢
				flag=0;
			}
		}else if((ls[0].n==ls[1].n&&ls[1].n==ls[2].n)&&(zs[0].n!=zs[1].n||zs[1].n!=zs[2].n)){//李四是飞机张三不是,李四赢
			flag=1;
		}
		
		if(zs[0].n+1==zs[1].n&&zs[1].n+1==zs[2].n){//张三是顺子 
			if(ls[0].n+1==ls[1].n&&ls[1].n+1==ls[2].n){//如果李四也是顺子,比较
				if(zs[2].n>ls[2].n)flag=0;
					else if(zs[2].n<ls[2].n)flag=1;
					else if(zs[2].n==ls[2].n)flag=2;
			}else flag=0;//李四不是顺子,张三赢
		}else{
			if(ls[0].n+1==ls[1].n&&ls[1].n+1==ls[2].n){//李四是顺子张三不是顺子,李四赢
				flag=1;
			}
		}
		
		if(zs[0].h==zs[1].h&&zs[1].h==zs[2].h){//张三是同花 
			if(ls[0].h!=ls[1].h||ls[1].h!=ls[2].h){//李四不是同花,张三赢
				flag=0;
			}else{//李四也是同花 
				if(zs[0].n+1==zs[1].n&&zs[1].n+1==zs[2].n){//张三是同花顺 
					if(ls[0].n+1==ls[1].n&&ls[1].n+1==ls[2].n){//李四也是同花顺 
						if(ls[0].n>zs[0].n)flag=1; //比较大小 
						else if(ls[0].n==zs[0].n)flag=2;
						else if(ls[0].n<zs[0].n)flag=0;
					}else {//张三是同花顺李四不是 
						flag=0; 
					}}
				else if(ls[0].n+1==ls[1].n&&ls[1].n+1==ls[2].n){//李四是同花顺张三不是 
					flag=1;
					}
				else{//张三李四都只是同花而不是同花顺则比较最大数 
					if(zs[2].n>ls[2].n)flag=0;
					else if(zs[2].n<ls[2].n)flag=1;
					else if(zs[2].n==ls[2].n)flag=2;
				}
				}
		}
		
		
		if(flag==0)cout<<"zhangsan"<<endl;
		if(flag==1)cout<<"lisi"<<endl;
		if(flag==2)cout<<"tie"<<endl;
	}
	return 0;
}

问题D: 该谁发球了?

题目描述

乒乓球是一项很受国人欢迎的运动,假设A和B对打,每次都是A先发球,那么乒乓球的发球规则如下:
1、一方得11分,另一方得分小于等于9分,比赛结束,前者获胜;
2、如果出现10:10的比分,那么比赛进入延长赛,双方轮流发一次球,当分差是2分时比赛结束,得分多者获胜;
3、其它情况,双方轮流发2次球;
请编写程序,根据当前比分判断该谁发球了?

输入格式

输入包括多行数据,每行数据包括两个正整数a和b,代表A和B在乒乓球比赛中的比分,0<=a,b<=100
输出格式
针对每行输入,输出接下来的发球方是A还是B?如果比赛结束,输出Game Over

输入样例 复制

0 0
0 2
11 9

输出样例 复制

A
B
Game Over

这道题只需要注意什么叫轮流发两次球。轮流发一次球是A发一次B发一次,轮流发两次球是A发两次然后B发两次。

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int a,b;
	int flag;  //0代表A发球,1代表B发球,2代表Game Over
	while(cin>>a>>b){
		flag=-1;
		if(a==11&&b<=9){
			flag=2;
		}else if(b==11&&a<=9){
			flag=2;
		}
		else if(a>=10&&b>=10){
			if(fabs(a-b)==2){
				flag=2;
			}else{
				if((a+b)%2==0){
					flag=0;
				}else flag=1;
			}
		}else {
			if((a+b)/2%2==0){
					flag=0;
				}else flag=1;
		}
		if(flag==0)cout<<"A"<<endl;
	else if(flag==1)cout<<"B"<<endl;
	else if(flag==2)cout<<"Game Over"<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值