题目描述和作者反应
最近作者考试的时候遇到了一个难题,题目如下:
描述
小童和小美玩扑克牌的游戏,他们准备了两幅扑克牌。
扑克牌的游戏规则如下:
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
作者看题的反应:
- 哇!题目好长
- 哇!题目好难
- 啊!神魔也不会
- 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(无语)
所以我这算不算偷鸡