兩人鬥地主簡化版。己方先出,要求一次出完牌或對方要不起。
模擬,先判斷己方能否一次出完,之後就從威力最大的牌開始判斷就行了:是否有雙王->是否有炸彈->是否有最大單牌->是否有最大pair->是否有3張->3帶2->3帶1
代碼:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <utility>
#include <algorithm>
#define mod
#define len 100010
using namespace std;
int c1[20];
int c2[20];
int sum1,sum2;
int clear(int c[],int sum1);//判斷能否一次性出完
int Trio(int c[]);//尋找最大3張
int Pair(int c[]);//尋找最大pair
int Bomb(int c[]);//尋找最大炸彈
int X_Y(int c[]);//判斷是否有雙王
int MAX(int c[]);//尋找最大單牌
int clear(int c[],int sum1)
{
int res=0;
if(sum1==1)
res= 1;
else if(sum1==2&&Pair(c))
res= 1;
else if(sum1==3&&Trio(c))
res= 1;
else if(sum1==4&&(Trio(c)||Bomb(c)))
res=1;
else if(sum1==5&&Trio(c)&&Pair(c))
res=1;
else if(sum1==6&&Bomb(c))
res=1;
else if(X_Y(c))
res=1;
return res;
}
int Trio(int c[])
{
int flag=0;
for(int i=3;i<=17;++i)
if(c[i]==3)
{
flag=i;
//break;
}
return flag;
}
int Pair(int c[])
{
int flag=0;
for(int i=3;i<=17;++i)
if(c[i]==2)
{
flag=i;
//break;
}
return flag;
}
int Bomb(int c[])
{
int flag=0;
for(int i=3;i<=17;++i)
if(c[i]==4)
{
flag=i;
//break;
}
return flag;
}
int X_Y(int c[])
{
int res=0;
if(c[16]==c[17]&&c[16]==1)
res=1;
return res;
}
int MAX(int c[])
{
int flag=0;
for(int i=3;i<=17;++i)
if(c[i]>0)
{
flag=i;
//break;
}
return flag;
}
int main()
{
int T;
char s1[len],s2[len];
scanf("%d",&T);
while(T--)
{
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
scanf("%s%s",s1,s2);
sum1=strlen(s1);
sum2=strlen(s2);
for(int i=0;s1[i]!='\0';++i)
{
if(('0'<=s1[i])&&('9'>=s1[i]))
c1[s1[i]-'0']+=1;
if(s1[i]=='2')
c1[15]++;
if(s1[i]=='A')
c1[14]++;
else if(s1[i]=='T')
c1[10]++;
else if(s1[i]=='J')
c1[11]++;
else if(s1[i]=='Q')
c1[12]++;
else if(s1[i]=='K')
c1[13]++;
else if(s1[i]=='X')
c1[16]++;
else if(s1[i]=='Y')
c1[17]++;
}
for(int i=0;s2[i]!='\0';++i)
{
if(('0'<=s2[i])&&('9'>=s2[i]))
c2[s2[i]-'0']+=1;
if(s2[i]=='2')
c2[15]++;
if(s2[i]=='A')
c2[14]++;
else if(s2[i]=='T')
c2[10]++;
else if(s2[i]=='J')
c2[11]++;
else if(s2[i]=='Q')
c2[12]++;
else if(s2[i]=='K')
c2[13]++;
else if(s2[i]=='X')
c2[16]++;
else if(s2[i]=='Y')
c2[17]++;
}
if(clear(c1,sum1))
printf("Yes\n");
else
{
int flag=0;
if(X_Y(c2))
flag=0;
else if(Bomb(c1)>=Bomb(c2)&&Bomb(c1)!=0)
flag=1;
else if(Bomb(c1)<Bomb(c2)&&Bomb(c2)!=0)
flag=0;
else if(Bomb(c1)==Bomb(c2)&&Bomb(c1)==0)
{
if(MAX(c1)>=MAX(c2))
flag=1;
else if(MAX(c1)<MAX(c2))
{
if(Trio(c1)>0)//
{
if(!Trio(c2))
flag=1;
else
{
int count1=0,count2=0;
for(int i=3;i<=17;++i)
if(c1[i]>=2)
count1++;
for(int i=3;i<=17;++i)
if(c2[i]>=2)
count2++;
if(count1>1)
{
if(count2<=1)
flag=1;
else if(Trio(c1)>=Trio(c2))
flag=1;
else
flag=0;
}
else
{
if(sum2<4)
flag=1;
else if(Trio(c1)>=Trio(c2))
flag=1;
else
flag=0;
}
}
}
else //
{
int mark=0;
for(int i=3;i<=17;++i)
if(c2[i]>=2)
mark=i;
if(Pair(c1)>=mark&&Pair(c1)>0)
flag=1;
else
flag=0;
}
}
}
printf((flag==1)?"Yes\n":"No\n");
}
}
return 0;
}