4 33A 2 33A 22 33 22 5559T 9993
Yes No Yes Yes
题意:两个人打扑克,规则参照斗地主。问先手能否一次出完牌或者出的第一手牌让对方无牌可出!!
模拟就是了:
#include"stdio.h"
#include"string.h"
#define N 20
#define M 100
int a[N],b[N],n,m;
char s[N];
int max(int a,int b)
{
return a>b?a:b;
}
void inti(char*s,int f)
{
int i,t;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='3'&&s[i]<='9')
{
t=s[i]-'0'-2;
}
else if(s[i]=='T')
t=8;
else if(s[i]=='J')
t=9;
else if(s[i]=='Q')
t=10;
else if(s[i]=='K')
t=11;
else if(s[i]=='A')
t=12;
else if(s[i]=='2')
t=13;
else if(s[i]=='X')
t=14;
else if(s[i]=='Y')
t=15;
if(f==1)
a[t]++;
else
b[t]++;
}
}
int escape()
{
int i;
if(n==1) //枚举我方有几张牌,能否一次出完
return 1;
if(n==2)
{
int n2=0;
for(i=1;i<14;i++)
if(a[i]==2)
n2++;
if(n2==1)
return 1;
}
if(n==3)
{
int n3=0;
for(i=1;i<14;i++)
if(a[i]==3)
n3++;
if(n3==1)
return 1;
}
if(n==4)
{
int n3=0;
for(i=1;i<14;i++)
{
if(a[i]>=3)
n3++;
}
if(n3==1)
return 1;
}
if(n==5)
{
int n2=0,n3=0;
for(i=1;i<14;i++)
{
if(a[i]==3)
n3++;
if(a[i]==2)
n2++;
}
if(n2==1&&n3==1)
return 1;
}
if(n==6)
{
int n4=0;
for(i=1;i<14;i++)
{
if(a[i]==4)
n4++;
}
if(n4==1)
return 1;
}
return 0;
}
int beat()
{
int i,j;
if(a[14]==1&&a[15]==1)
return 1;
if(b[14]==1&&b[15]==1)
return 0; //对方有王炸
for(i=13;i>0;i--)
if(a[i]==4)
break;
for(j=13;j>0;j--)
if(b[j]==4)
break;
if(j>0) //对方有炸弹,
{
if(i>=j)
return 1;
else
return 0;
}
if(n>=5) //下面就是对方没有炸弹,
{ //出3带2,下面3带1就不用枚举了
int a3,a2,b3,b2;
a3=a2=b3=b2=0;
for(i=13;i>0;i--)
{
if(a[i]==3)
a3=max(a3,i);
if(a[i]==2)
a2=max(a2,i);
}
for(j=13;j>0;j--)
{
if(b[j]==3)
b3=max(b3,j);
if(b[j]==2)
b2=max(b2,j);
}
if(a3!=0&&a2!=0)
{
if(a3>=b3||b2==0)
return 1;
}
} //四张牌只能是炸弹或者3带1,
if(n>=3)
{
for(i=13;i>0;i--)
if(a[i]>=3)
break;
for(j=13;j>0;j--)
if(b[j]>=3)
break;
if(i!=0)
{
if(i>=j)
return 1;
}
}
if(n>=2)
{
for(i=13;i>0;i--)
if(a[i]>=2)
break;
for(j=13;j>0;j--)
if(b[j]>=2)
break;
if(i!=0)
{
if(i>=j)
return 1;
}
}
if(n>=1) //出一张牌 无炸弹
{
for(i=15;i>0;i--)
if(a[i])
break;
for(j=15;j>0;j--)
if(b[j])
break;
if(i>=j)
return 1;
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s",s);
n=strlen(s);
inti(s,1);
scanf("%s",s);
m=strlen(s);
inti(s,2);
if(escape()) //能否一次把牌出完
{
printf("Yes\n");
continue;
}
if(beat()) //第一手牌无敌
printf("Yes\n");
else
printf("No\n");
}
return 0;
}hdu 4930 Fighting the Landlords (模拟),布布扣,bubuko.com
hdu 4930 Fighting the Landlords (模拟)
原文:http://blog.csdn.net/u011721440/article/details/38423597