题目链接:hdu 4930
斗地主规则,给定你的牌与对手的牌,判断能否出一次牌,让对面没有牌大过你,或者出一次牌就把自己的所有牌出完。
依据各个规则进行判断,最后要特别判一下王炸与炸弹的情况即可。
/********************************************************************* FileName: 1010.cpp Author: kojimai
Created Time: 2014年08月07日 星期四 14时44分20秒
*********************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s1[20],s2[20];
int p1[20],p2[20],len1,len2;
bool flag,first;//first表示出一次牌就出完了,flag表示存在一种情况可以大过对面
int get(char ch)
{
switch(ch)
{
case '3':return 3;break;
case '4':return 4;break;
case '5':return 5;break;
case '6':return 6;break;
case '7':return 7;break;
case '8':return 8;break;
case '9':return 9;break;
case 'T':return 10;break;
case 'J':return 11;break;
case 'Q':return 12;break;
case 'K':return 13;break;
case 'A':return 14;break;
case '2':return 15;break;
case 'X':return 16;break;
case 'Y':return 17;break;
}
return 0;
}
void turn()
{
memset(p1,0,sizeof(p1));
memset(p2,0,sizeof(p2));
for(int i=0;s1[i]!='\0';i++)
{
p1[get(s1[i])]++;
}
for(int i=0;s2[i]!='\0';i++)
{
p2[get(s2[i])]++;
}
return;
}
int bomb()//炸弹的情况
{
int l1=0,l2=0;
for(int i=15;i>=3;i--)
{
//cout<<"i="<<i<<" p[i]="<<p1[i]<<endl;
if(p1[i]==4)
{
if(len1==4)
{
first=true;//一手出完炸弹
return 2;
}
l1=i;
break;
}
}
for(int i=15;i>=3;i--)
{
if(p2[i]==4)
{
l2=i;
break;
}
}
//cout<<"l1="<<l1<<" l2="<<l2<<endl;
if(l1>l2)//炸弹能大过对面
{
flag=true;
return 2;
}
else if(l2>l1)//没有炸弹大过对面
{
return 1;
}
return 0;//凭炸弹无法判断
}
void single()//出单张牌的情况
{
if(len1==1)
{
first=true;
flag=true;
return;
}
int l1=0,l2=0;
for(int i=17;i>=3;i--)
{
if(p1[i])
{
l1=i;
break;
}
}
for(int i=17;i>=3;i--)
{
if(p2[i])
{
l2=i;
break;
}
}
//cout<<"l1="<<l1<<" l2="<<l2<<endl;
if(l1>=l2)
{
flag=true;
}
return;
}
void pai()//一对
{
int l1=0,l2=0;
for(int i=15;i>=3;i--)
{
if(p1[i]>=2)
{
l1=i;
if(len1==2)
{
first=true;flag=true;
return;
}
break;
}
}
//cout<<"l1="<<l1<<endl;
if(l1==0)
return;
for(int i=15;i>=3;i--)
{
if(p2[i]>=2)
{
l2=i;
break;
}
}
if(l1>=l2)
{
flag=true;
}
return;
}
void trio()//三张
{
if(len1<3)
return;
int l1=0,l2=0;
for(int i=15;i>=3;i--)
{
if(p1[i]>=3)
{
l1=i;
if(len1==3)
{
first=true;flag=true;return;
}
break;
}
}
if(l1==0)
return;
if(l1&&len2<3)
{
flag=true;return;
}
for(int i=15;i>=3;i--)
{
if(p2[i]>=3)
{
l2=i;
break;
}
}
if(l1>l2)
{
flag=true;
}
return;
}
void triosolo()//三带一
{
if(len1<=3)
return;
int l1=0,l2=0;
for(int i=15;i>=3;i--)
{
if(p1[i]>=3)
{
l1=i;
if(len1==4)
{
first=true;flag=true;return;
}
break;
}
}
if(l1==0)
return;
else if(len2<4)
{
flag=true;return;
}
for(int i=15;i>=3;i--)
{
if(p2[i]>=3)
{
if(len2-p2[i]>0)
{
l2=i;
break;
}
}
}
if(l1>l2)
{
flag=true;
}
return;
}
void triop()//三带一对
{
//cout<<"len1="<<len1<<endl;
if(len1<5)
return;
bool flag1=false,l1=0;
for(int i=15;i>=3;i--)
{
if(p1[i]==3)
{
if(l1==0)
{
l1=i;
if(flag1)
break;
else
{
flag1=true;
break;
}
}
else if(p1[i]==2)
{
flag1=true;
if(l1)
{
break;
}
}
}
//cout<<"l1="<<l1<<endl;
if(l1&&flag1)
{
if(len1==5)
{
first=true;
flag=true;
return;
}
if(len2<5)
{
flag=true;
return;
}
int l2=0;bool flag2=false;
for(int i=15;i>=3;i--)
{
if(p2[i]>=3)
{
if(l2==0)
{
l2=i;
if(flag2)
break;
}
else
{
flag2=true;
break;
}
}
else if(p2[i]==2)
{
flag2=true;
}
}
if(flag2&&l2)
{
if(l1>l2)
{
flag=true;
}
return;
}
else
{
flag=true;return;
}
}
return;
}
void fd()//四带二
{
if(len1<6)
return;
int l1=0;
for(int i=15;i>=3;i--)
{
if(p1[i]==4)
{
l1=i;
break;
}
}
if(l1)
{
if(len1==6)
{
first=true;
flag=true;
return;
}
if(len2<6)
{
flag=true;
return;
}
int l2=0;
for(int i=15;i>=3;i--)
{
if(p2[i]==4)
{
l2=i;break;
}
}
if(l1>l2)
{
flag=true;return;
}
}
return;
}
int main()
{
int keng;
scanf("%d",&keng);
while(keng--)
{
flag=false;first=false;
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
turn();
single();
//cout<<first<<' '<<flag<<endl;
pai();
//cout<<first<<' '<<flag<<endl;
trio();
//cout<<first<<' '<<flag<<endl;
triosolo();
//cout<<first<<' '<<flag<<endl;
triop();
//cout<<first<<' '<<flag<<endl;
fd();
//cout<<first<<' '<<flag<<endl;
if(first)//一手出完了
printf("Yes\n");
else
{
if(p1[16]&&p1[17])//自己有王炸
printf("Yes\n");
else
{
int t=bomb();
//cout<<"t="<<t<<endl;
if(p2[16]&&p2[17])//对面有王炸
{
if(first)
printf("Yes\n");
else
printf("No\n");
}
else if(t==2)
{
printf("Yes\n");
}
else if(t==1)
{
printf("No\n");
}
else
{
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}
}
}
return 0;
}