zcmu1713(模拟)

1713: 打麻将

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 153  Solved: 51
[Submit][Status][Web Board]

Description

卡斯丁狗表示真月里那几天,天天在打麻将,他的手气很好,总是摸到三四个财神,于是他就怒赚了一波红包。由于长得帅,他就想把这个不可告人的赚钱胡牌大法告诉你。

已知胡牌公式是这样的XXX*N+Y(Y+1)(Y+2)*M+ZZ(N*M可以等于0)就可以胡牌。例如用1-9表示点数,字母abc分别表示条子,筒子,万子。那么   1a2a3a  3a4a5a 6b7b8b 9c9c9c 1b1b是可以胡牌的。为了教育初学者,现给出5张牌,问是否会胡牌。

Input

多组测试数据

输入一个含10个字符的字符串。

每种牌的个数<=4

Output

胡牌输出Y,否则输出N。

Sample Input

1a1a1a2b2b

1a2a3a2c2c

1a2a4a2c2c

1a2b3c4a4a

Sample Output

Y

Y

N

N

解析:由公式XXX*N+Y(Y+1)(Y+2)*M+ZZ(N*M可以等于0)可得出,肯定存在ZZ这两张牌。所以我们对ZZ模拟位置。01,12,23,34,其中12和23是一样的。然后在分别对XXX*N,和Y(Y+1)(Y+2)*M模拟

#include
using namespace std;
 
#define e exp(1)
#define pi acos(-1)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))
int gcd(int a,int b){return b?gcd(b,a%b):a;}

char s[30];
int a[30];
int main()
{
	while(~scanf("%s",s))
	{
		mem(a,0);
		int cnt=0,f=0;
		for(int i=0; i<10; i+=2)
		{
			int x=s[i]-'0';
			if(s[i+1]=='a')a[cnt++]=x;
			else if(s[i+1]=='b')a[cnt++]=x+100;
			else if(s[i+1]=='c')a[cnt++]=x+200;
		}
		sort(a,a+cnt);
		if(a[3]==a[4])
		{
			if(a[0]==a[1]&&a[1]==a[2])f=1;
			else if(a[2]-a[1]==1&&a[1]-a[0]==1)f=1;
		}
		else if(a[0]==a[1])
		{
			if(a[2]==a[3]&&a[3]==a[4])f=1;
			else if(a[3]-a[2]==1&&a[4]-a[3]==1)f=1;
		}
		else if(a[2]==a[3])
		{
			if(a[4]==a[1]&&a[1]==a[0])f=1;
			else if(a[4]-a[1]==1&&a[1]-a[0]==1)f=1;
		}
		if(f)puts("Y");
		else puts("N");	
	}
    return 0;
}

 

你可能感兴趣的:(#,zcmu,oj,#,模拟)