首页 > 代码库 > HDU 4930 Fighting the Landlords (超级暴力+读懂题意)

HDU 4930 Fighting the Landlords (超级暴力+读懂题意)

题目链接: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;
}