1713: 打麻将
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 127 Solved: 38
[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
HINT
Source
【解析】
感觉自己处理数据的能力还是有点弱。
这题,如何存储数据是个难点。还有就是有几种情况要弄清楚。
#include<bits/stdc++.h>
using namespace std;
char s[20];
int num[10][20];
int main() {
while (scanf("%s", s) == 1) {
memset(num, 0, sizeof(num));
for (int i = 0; s[i]; i += 2)
num[s[i + 1] - 'a' + 1][s[i] - '0' + 2]++;
int x = 0, y = 0, z = 0;
for (int i = 1; i<4; i++)
{
for (int j = 2; j<12; j++)
{
if (num[i][j] == 3)
{
x = 1;//有三个相等的
if (num[i][j - 2] && num[i][j - 1])//有三个种类相同,大小连续的
y = 1;
else if (num[i][j - 1] && num[i][j + 1])
y = 1;
else if (num[i][j + 2] && num[i][j + 1])
y = 1;
}
else if (num[i][j] == 2)//有两个相等的
z = 1;
}
}
if (x&&y == 0) //有三个相等的了,但是没有三个种类相同,大小连续的
{
for (int i = 1; i<4; i++)
for (int j = 2; j<12; j++)
if (num[i][j] == 2)//去找两个相等的
y = 1;
}
if (z&&y == 0) //有两个相等的,但是没有三个种类相同,大小连续的
{
for (int i = 1; i<4; i++)
{
for (int j = 2; j<12; j++)
{
if (num[i][j] == 3) y = 1;//找三个相等的
else if (num[i][j] == 1 && num[i][j + 1] == 1 && num[i][j + 2] == 1)//找有三个种类相同,大小连续的
y = 1;
}
}
}
if (y)
printf("Y\n");
else
printf("N\n");
}
return 0;
}