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<bits/stdc++.h>
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;
}