6939 扑克牌

题目描述和作者反应

最近作者考试的时候遇到了一个难题,题目如下:

描述

小童和小美玩扑克牌的游戏,他们准备了两幅扑克牌。
扑克牌的游戏规则如下:
1.单张扑克牌的顺序:3<4<5<6<7<8<9<X<J<Q<K<A<2<M<F。(X表示10,M表示小王,F表示大王)
2.两张相同的牌可以组成"对子",对子只能与对子比较,对子和单张无法相应,对子的顺序:33<44<55<66<77<88<99<XX<JJ<QQ<KK<AA<22<MM<FF。
3.TM是最大的牌,也称为"王炸",它能大于所有的对子和单张。
4.每一轮出牌,玩家可以出单张、对子或王炸中的一种,但必须符合1,2,3号规则。
现在,小童和小美从两副扑克牌中随机抽取两张牌,由小童先手。两人都采用最优策略出牌,最先出完所有牌的人获胜。若小童获胜,输出Tong;若小美胜出,输出Mei。你能判断谁会获胜吗?

输入描述

输入第一行一个整数T(1<=T<=100000),表示T轮游戏。
接下来T行,每行输入2个长度为2的字符串。第1个字符串表示小童抽取的2张牌,第2个字符串表示小美抽取的2张牌。

输出描述

输出T行,每行1个字符串。若小童获胜,输出Tong;若小美胜出,输出Mei。

样例输入:

2
22 MF
2X M3

样例输出:

Tong
Mei 

作者看题的反应:

  1. 哇!题目好长
  2. 哇!题目好难
  3. 啊!神魔也不会
  4. NO!啊~

于是作者冥思苦想,终于....

考试时间过了T~T

后来....

作者问了一位高人(身份保密)

高人说:

你这个得一个一个判断,不过可以简化一下

作者说:

这题可不可以把他们存储到一个数组里,如:

mb[15]={'3','4','5','6','7','8','9','X','J','Q','K','A','2','M','F'}

然后再判断下标(不明白的可以看后面代码)

高人说:

你这样也可以,但我的更靠谱

 作者就信了

代码

后来作者反骨发作,还是用作者对高人说的方法来做了

代码如下:

#include <bits/stdc++.h>
using namespace std;
int main(){
    char mb[15]={'3','4','5','6','7','8','9','X','J','Q','K','A','2','M','F'},t1,t2,m1,m2;
    int s;
    cin>>s;
    for(int i=0;i<=s;i++){
    	cin>>t1>>t2>>m1>>m2;
    	if((t1=='T'&&t2=='M')||(t1=='M'&&t2=='T')){
			cout<<"Tong";
			continue;
		}
		if((m1=='T'&&m2=='M')||(m1=='M'&&m2=='T')){
			cout<<"Mei";
			continue;
		}
   	 	if(t1==t2&&m1==m2){
			int ti,mi;
			for(int ii=0;ii<=15;ii++){
				if(t1==mb[ii]) ti=ii; 
				if(m1==mb[ii]) mi=ii; 
			}
			if(mi>ti){
				cout<<"Mei";
				continue;
			}else if(ti>mi){
				cout<<"Tong";
                continue;
			}
		}else if(t1==t2&&m1!=m2){
			cout<<"Tong";
            continue;
		}
		else if(m1==m2&&t1!=t2){
			cout<<"Mei";
            continue;
		}else{
			int ti1,ti2,tim,tin,mi1,mi2,mim,min_;
			for(int ii=0;ii<=15;ii++){
				if(t1==mb[ii]) ti1=ii; 
				if(t2==mb[ii]) ti2=ii; 
				if(m1==mb[ii]) mi1=ii; 
				if(m2==mb[ii]) mi2=ii; 
			}
			tim=max(ti1,ti2);
			mim=max(mi1,mi2);
			tin=min(ti1,ti2);
			min_=min(mi1,mi2);
			if(tim>mim){
				cout<<"Tong";
				continue;
			}else if(mim>tim){
				cout<<"Min";
				continue;
			}else{
				if(tin>min_){
					cout<<"Tong";
					continue;
				}else{
					cout<<"Min";
					continue;
				}
			}
		}
    }
	return 0;
}

​
思路版(极详细):
#include <bits/stdc++.h>//万能头文件
using namespace std;
int main(){
    char mb[15]={'3','4','5','6','7','8','9','X','J','Q','K','A','2','M','F'},t1,t2,m1,m2;//定义工具数组,小童的两张牌,小美的两张牌
    int s;//定义局数
    cin>>s;//输入局数
    for(int i=0;i<=s;i++){//循环s局
    	cin>>t1>>t2>>m1>>m2;//输入小童的两张牌和小美的两张牌
    	if((t1=='T'&&t2=='M')||(t1=='M'&&t2=='T')){//小童有王炸的两种情况
			cout<<"Tong";//小童胜
			continue;//此局结束
		}
		if((m1=='T'&&m2=='M')||(m1=='M'&&m2=='T')){//小美有王炸的两种情况
			cout<<"Mei";//小美胜
			continue;//此局结束
		}
   	 	if(t1==t2&&m1==m2){//二者都有对子的情况
			int ti,mi;//定义小童的牌在md数组的下标,小美的牌在md数组的下标
			for(int ii=0;ii<=15;ii++){//运行15次(3~F)
				if(t1==mb[ii]) ti=ii; //求小童的牌在md数组的下标并赋值
				if(m1==mb[ii]) mi=ii; //求小美的牌在md数组的下标并赋值
			}
			if(mi>ti){//小美的牌下标大于小童的牌下标
				cout<<"Mei";//小美胜
				continue;//此局结束
			}else if(ti>mi){//小童的牌下标大于小美的牌下标
				cout<<"Tong";//小童胜
                coutinue;//此局结束
			}
		}else if(t1==t2&&m1!=m2){//小童有对子而小美没有
			cout<<"Tong";//小童胜
            continue;//此局结束
		}
		else if(m1==m2&&t1!=t2){//小美有对子而小童没有
			cout<<"Mei";//小美胜
            continue;//此局结束
		}else{//谁都没有对子
			int ti1,ti2,tim,tin,mi1,mi2,mim,min_;//定义小童的第1张牌,小童的第2张牌,小美的第1张牌,小美的第2张牌,小童最大的牌,小童最小的牌,小美最大的牌,小美最小的牌(min是c++函数,所以得用min_)
			for(int ii=0;ii<=15;ii++){运行15次(3~F)
				if(t1==mb[ii]) ti1=ii; //求小童第1张牌在md数组的下标并赋值
				if(t2==mb[ii]) ti2=ii; //求小童第2张牌在md数组的下标并赋值
				if(m1==mb[ii]) mi1=ii; //求小美第1张牌在md数组的下标并赋值
				if(m2==mb[ii]) mi2=ii; //求小美第2张牌在md数组的下标并赋值
			}
			tim=max(ti1,ti2);//求小童最大的牌的下标并赋值
			mim=max(mi1,mi2);//求小童最小的牌的下标并赋值
			tin=min(ti1,ti2);//求小美最大的牌的下标并赋值
			min_=min(mi1,mi2);//求小美最小的牌的下标并赋值
			if(tim>mim){//小童最大的牌的下标比小美最大的牌大
				cout<<"Tong";//小童胜
				continue;//此局结束
			}else if(mim>tim){//小美最大的牌的下标比小童最大的牌大
				cout<<"Min";//小美胜
				continue;//此局结束
			}else{//小童最大的牌的下标和小美最大的牌一样
				if(tin>min_){//小童最小的牌的下标比小美最小的牌大
					cout<<"Tong";//小童胜
					continue;//此局结束
				}else{//小童最小的牌的下标比小美最小的牌小
					cout<<"Min";//小美胜
					continue;//此局结束
				}
			}
		}
    }
	return 0;//养成好习惯
}

​
结果... 

AC(无语)

所以我这算不算偷鸡

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值