E. 机智的学姐
题目描述
斗地主玩法简单,娱乐性强,老少皆宜。据传在万恶的旧社会,地主横行乡里,无恶不做,人们为了发泄对地主的痛恨,常常在一天的劳作之后,一家人关起门来“斗地主”。该游戏由三人玩一副牌,地主为一方,其余两家为另一方,双方对战,先出完手中牌的一方胜。
机智的学姐已经通过某些不和谐的手段,得到了下家手上的牌型,可是学姐的机智值全都用来得到下家牌型了。她非常想知道自己是不是有一种出牌的方法,使得下家没有办法能大过自己,这个艰难的任务就交给你了。(不用判断输赢,只需判断这一轮牌有没有好的策略使下家没法大过自己)
关于牌型比较
火箭:即双王(大王和小王),最大的牌。
炸弹:四张同数值牌(如四个7)。
单牌:单个牌(如一张5)。
对牌:数值相同的两张牌(如一对4)。
三张牌:数值相同的三张牌(如三个J)。
三带一:数值相同的三张牌 + 一张单牌或一对牌。例如:333+6 或 444+99。
单顺:五张或更多的连续单牌(如:45678 或 78910JQK)。不包括 2 点和双王。
双顺:三对或更多的连续对牌(如:334455 、77 88 99 1010 JJ)。不包括 2 点和双王。
三顺:二个或更多的连续三张牌(如:333444 、 555 666 777 888)。不包括 2 点和双王。
飞机带翅膀:三顺+同数量的单牌(或同数量的对牌)。
如: 444555+79 或 333444555+7799JJ。
四带二:四张牌+两手牌(注意:四带二不是炸弹)。
如: 5555+3+8 或 4444+55+77。
关于牌型大小
火箭最大,可以打任意其他的牌。
炸弹比火箭小,比其他牌大。都是炸弹时按牌的分值比大小。
除火箭和炸弹外,其他牌必须要牌型相同且总张数相同才能比大小。相同牌型按牌的分值比大小。
依次是 大王 > 小王 >2>A>K>Q>J>10>9>8>7>6>5>4>3 ,不分花色。
输入格式
为了处理方便,我们用Y表示大王,X表示小王,T表示10。
所有牌都用A23456789TJQKXY表示,两家牌的数量小于20。
每组数据两行,有多组数据,EOF结束。
输出格式
每个测试数据一行Yes或者No
输入样例
A334455
23456789
23456
456789
AJJJ
3333
输出样例
Yes Yes No
#include<cstdio> #include<cstdlib> #include<iostream> #include<map> #include<cstring> #define ll long long #define N 100 using namespace std; int l1,l2,i,j,k,Maxa,Maxb; map<char,int>pat; string a,b; int p1[N],p2[N]; int Comba[N],Combb[N];//记录下连牌时的最大牌的数字 void re(int* q){for(i=0;i<N;i++)q[i]=0;} void solve(){ re(Comba);re(Combb); for(i=3;i<=17;i++){ if(p1[i])Comba[p1[i]]=i; if(p2[i])Combb[p2[i]]=i; } if(p1[16]&&p1[17])Comba[4]=17;//双王MAX if(p2[16]&&p2[17])Combb[4]=17; if(Comba[4]>=Combb[4]&&Comba[4]){printf("Yes\n");return;}//火箭和炸弹 else if(Comba[4]<Combb[4]){printf("No\n");return;} else if(Maxa>=Maxb){printf("Yes\n");return;}//单牌 else if(Comba[2]>=Combb[2]&&Comba[2]){printf("Yes\n");return;}//对牌 else if(Comba[3]>=Combb[3]&&Comba[3]){printf("Yes\n");return;}//三张牌 for(i=3;i<=10;i=j){//单顺 for(j=i;j<=14;j++) if(!p1[j])break; if(j-i>=5)Comba[j-i]=j-1; while(!p1[j])j++; } for(i=3;i<=10;i=j){ for(j=i;j<=14;j++) if(!p2[j])break; if(j-i>=5)Combb[j-i]=j-1; while(!p2[j])j++; } for(i=12;i>=5;i--)if(Comba[i]>=Combb[i]&&Comba[i]){printf("Yes\n");return;} for(i=3;i<=12;i=j){//双顺 for(j=i;j<=14;j++) if(p1[j]<2)break; if(j-i>=3)Comba[2*(j-i)+15]=j-1; while(p1[j]<2)j++; } for(i=3;i<=12;i=j){ for(j=i;j<=14;j++) if(p2[j]<2)break; if(j-i>=3)Combb[2*(j-i)+15]=j-1; while(p2[j]<2)j++; } for(i=38;i>=21;i--)if(Comba[i]>=Combb[i]&&Comba[i]){printf("Yes\n");return;} printf("No\n"); } int main(){ ios_base::sync_with_stdio(false); pat['3']=3;pat['4']=4;pat['5']=5;pat['6']=6; pat['7']=7;pat['8']=8;pat['9']=9;pat['T']=10; pat['J']=11;pat['Q']=12;pat['K']=13;pat['A']=14; pat['2']=15;pat['X']=16;pat['Y']=17; while(cin>>a>>b){ Maxa=Maxb=0; l1=a.size(); l2=b.size(); for(i=0;i<l1;i++){ p1[pat[a[i]]]++; if(pat[a[i]]>Maxa)Maxa=pat[a[i]]; } for(i=0;i<l2;i++){ p2[pat[b[i]]]++; if(pat[b[i]]>Maxb)Maxb=pat[b[i]]; } solve(); re(p1);re(p2); } return 0; }