1607 - 打牌

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

牌只有1到9,手里拿着已经排好序的牌a,对方出牌b,用程序判断手中牌是否能够压过对方出牌。 

规则:出牌牌型有5种   
[1]一张 如4 则5...9可压过 
[2]两张 如44 则55,66,77,...,99可压过 
[3]三张 如444 规则如[2] 
[4]四张 如4444 规则如[2] 
[5]五张 牌型只有12345 23456 34567 45678 56789五个,后面的比前面的均大。

题目输入

输入有多组数据。

每组输入两个字符串(字符串大小不超过100)a,b。a字符串代表手中牌,b字符串代表别人打出的牌。

题目输出

压过输出YES 否则NO。

输入/输出样例

输入格式

123456789
22
123455789
33
2345678
34567

输出格式

NO
YES
YES

C语言解答

#include<stdio.h>
#include<string.h>
int judge(char *a,char *b,int l)
{
	int i,j,d,k;
	d=strlen(a);
	k=0;
	for(i=0;i<d;i++)
	{
		if(a[i]>b[0])
		{
		   for(j=i;a[j]==a[i];j++)
			   k++;
		   if(k>=l)
		{
			return 1;
			break;
		}
		   else
		   {
			   k=0;
			   i=j-1;
		   }
		}
	}
	return 0;

}
int judge1(char *a,char *b)
{
	int i,l,d,k;
	d=0;
	l=strlen(a);
	for(i=0;i<l;i++)
	{
		if(a[i]>b[0])
		{   d++;
			for(k=i+1;k<l;k++)
			{
				if(a[k]-a[k-1]==1)
					d++;
			}
			if(d>=5)
			{
				return 1;
				break;
			}
			else 
			{
				d=0;
			}

		}
	}
	
return 0;
}

int main()
{
	char a[101],b[101];
	int h,l;
	while(scanf("%s",&a)!=EOF)
	{
		scanf("%s",&b);
		l=strlen(b);
		if(l<5)
			h=judge(a,b,l);
		else
			h=judge1(a,b);
		if(h==1)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;

}

C++解答

#include<stdio.h>
#include<string.h>
char a[111],b[111];
void run()
{
	int c[11],i,j,n,m;//数组c记录自己持有各种牌的张数,以便检索。 
	n=strlen(a)-1;
	for(i=1;i<=9;i++)
		c[i]=0;
	for(i=0;i<=n;i++)
		c[a[i]-'0']++;
	m=strlen(b);
	if(m<=4)
	{
		for(i=b[0]-'0'+1;i<=9;i++)
			if(c[i]>=m)//在自己手里找m张相同的牌 
			{
				printf("YES\n");
				return;
			}
		printf("NO\n");
		return;	
	}
	else
	{
		for(i=b[0]-'0'+1;i<=5;i++)
			if((c[i]>=1)&&(c[i+1]>=1)&&(c[i+2]>=1)&&(c[i+3]>=1)&&(c[i+4]>=1))//找顺子 
			{
				printf("YES\n");
				return;
			}
		printf("NO\n");
		return;	
	}
}
int main()
{
	scanf("%s%s",a,b);
	while(strcmp(a,"")!=0)
	{
		run();
		strcpy(a,"");
		scanf("%s%s",a,b);
	}
}
//无论是多少张,别人打出的牌的大小只与b[0]有关,也就是说在长度和b[0]确定时,牌是确定的。