题目链接:HDU 4930 Fighting the Landlords
斗地主!!。不会玩这游戏,真是苦逼。题意其他都还好,就是要注意只要第一个回合1号玩家能压制2号玩家就算赢了(突破点)。
其他就分类暴力了,思路还是比较清晰的。
注意点:
1.对方炸弹,必输
2.一回合就出完牌,必胜
AC代码:
#include<stdio.h>
#include<string.h>
int vis1[30],vis2[30];
int find(char s)
{
if(s=='T')
return 10;
else if(s=='J')
return 11;
else if(s=='Q')
return 12;
else if(s=='K')
return 13;
else if(s=='A')
return 14;
else if(s=='2')
return 15;
else if(s=='X')
return 16;
else if(s=='Y')
return 17;
else if(s>='3' && s<='9')
return s-'0';
}
int main()
{
int t,i,j;
char s1[20],s2[20];
int len1,len2;
#ifdef ONLINE_JUDGE
#else
freopen("E:/ZJUNIT/ACM/test/ACMtest/1010.txt","r",stdin);
#endif
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
memset(vis1,0,sizeof vis1);
memset(vis2,0,sizeof vis2);
scanf("%s",s1);
scanf("%s",s2);
//printf("%s\n",s1);
//printf("%s\n",s2);
len1=strlen(s1);
for(i=0;i<len1;i++)
vis1[find(s1[i])]++;
len2=strlen(s2);
for(i=0;i<len2;i++)
vis2[find(s2[i])]++;
int mark=0,count=0;
//
int a=0,b=0,c=0,d=0;
int e=0,f=0,orz=0;
if(vis1[16]!=0 && vis1[17]!=0)
e++;
if(vis2[16]!=0 && vis2[17]!=0)
f++;
for(i=0;i<20;i++)
{
if(vis1[i]>0)
{
if(vis1[i]==1)
a++;
if(vis1[i]==2)
b++;
if(vis1[i]==3)
c++;
if(vis1[i]==4)
d++;
}
if(vis2[i]==4)
orz++;
}
//王炸
if(e==1)
{
printf("Yes\n");
continue;
}
//一次出完 a是1张牌。b是2张牌,c是3张牌,d是4张牌
if(len1==1)
{
printf("Yes\n");
continue;
}
if(len1==2 && b==1)
{
printf("Yes\n");
continue;
}
if((len1==3 && c==1) || (len1==4 && c==1 && a==1) || (len1==5 && c==1 && b==1) || (len1==5 && c==1 && a==2))
{
printf("Yes\n");
continue;
}
if((len1==4 && d==1) ||(len1==6 && d==1 && b==1) || (len1==6 && d==1 && a==2))
{
printf("Yes\n");
continue;
}
if(f==1 || orz!=0)//对手有炸弹
{
printf("No\n");
continue;
}
int max1=-1,max2=0;
for(i=0;i<20;i++)
{
if(vis1[i]>=1 && max1<i)
max1=i;
if(vis2[i]>=1 && max2<i)
max2=i;
}
if(max1>=max2)
{
printf("Yes\n");
continue;
}
//2
max1=-1,max2=0;
for(i=0;i<20;i++)
{
if(vis1[i]>=2 && max1<i)
max1=i;
if(vis2[i]>=2 && max2<i)
max2=i;
}
if(max1>=max2)
{
printf("Yes\n");
continue;
}
//3
max1=-1,max2=0;
for(i=0;i<20;i++)
{
if(vis1[i]>=3 && max1<i)
max1=i;
if(vis2[i]>=3 && max2<i)
max2=i;
}
if(max1>=max2)
{
printf("Yes\n");
continue;
}
//4
max1=-1,max2=0;
for(i=0;i<20;i++)
{
if(vis1[i]>=4 && max1<i)
max1=i;
if(vis2[i]>=4 && max2<i)
max2=i;
}
if(max1>=max2)
{
printf("Yes\n");
continue;
}
printf("No\n");
}
}
return 0;
}