胡牌有以下几种情况:
1、一个对子 + 4组 3个相同的牌或者顺子。 只有m、s、p是可以构成顺子的。东西南北这样的牌没有顺子。
2、7个不同的对子。
3、1m,9m,1p,9p,1s,9s,1c,2c,3c,4c,5c,6c,7c. 这13种牌每种都有,而且仅有这13种牌。肯定是有一种2张。其他的1张。
首先是枚举18+7=34张牌,加进去构成14张牌,判断胡牌。
胡牌判断如下。
对于第一种情况:枚举每一个对子。然后按照顺序找3张相同或者顺子。如果有三种相同的,构成3张相同的。没有就看能不能和后面的构成顺子。一定要按照顺序从小到大找过去。 1c```7c只能构成3张一样的。然后判断是不是刚好找到4组。
对于第二种情况:就是要每一种牌的数量要么是0,要么是2,这样一定是7个不同的对子了。
对于第三种情况:就是要让这13种牌的数量不等于0,而且其他牌的数量为0;
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int T, ans[300], sub, p[100], v[100];
char c, str[10];
const char * mah[] =
{
"1m","2m","3m","4m","5m","6m","7m","8m","9m",
"1s","2s","3s","4s","5s","6s","7s","8s","9s",
"1p","2p","3p","4p","5p","6p","7p","8p","9p",
"1c","2c","3c","4c","5c","6c","7c"
};
int ver[20] = {
0,8,9,17,18,26,27,28,29,30,31,32,33
};
int convert(char * s){
for(int i = 0; i < 34; i ++){
if(strcmp(s,mah[i]) == 0)
return i;
}return -1;
}
// return false
bool three(int x){
int ret = 0;
int tmp[35] ;
for(int i = 0; i < 34; i ++) tmp[i] = p[i];
for(int i = 0; i <= 18; i += 9){
for(int j = 0; j < 9; j ++){
if(tmp[i + j] >= 3){
tmp[i + j] -= 3;
ret ++;
}
while(j + 2 < 9 && tmp[i + j] && tmp[i + j + 1] && tmp[i + j + 2]){
tmp[i + j] --;
tmp[i + j + 1] --;
tmp[i + j + 2] --;
ret ++;
}
}
}
for(int j = 0; j < 7; j ++){
if(tmp [27 + j] >= 3){
tmp[27 + j] -= 3;
ret ++;
}
}
if(ret == 4) return true;
return false;
}
bool realcheck(){
for(int i = 0; i < 34; i ++){
if(p[i] >= 2){
p[i] -= 2;
if(three(0)){
p[i] += 2;
return true;
}p[i] += 2;
}
}
return false;
}
bool eyes(){
for(int i = 0; i < 34; i ++){
if(p[i] != 2 && p[i] != 0)
return false;
}
return true;
}
bool spe(){
for(int j = 0; j < 7; j ++)
if(p[j + 27] == 0)
return false;
for(int i = 0; i <= 18; i += 9){
if(p[i] == 0 || p[i + 8] == 0) return false;
for(int j = 1; j < 8; j ++){
if(p[i + j] != 0)
return false;
}
}
return true;
}
bool judge(){
if(realcheck() || eyes() || spe()){
return true;
}return false;
}
int main(){
scanf("%d", & T);
while(T --){
for(int i = 0; i < 13; i ++){
scanf("%s", str);
v[i] = convert(str);
}
memset(p, 0, sizeof(p));
for(int i = 0; i < 13; i ++){
p[v[i]] ++;
}
sub = 0;
for(int i = 0; i < 34; i ++){
if(p[i] < 4){
p[i] ++;
if(judge()){
ans[sub ++] = i;
}
p[i] --;
}
}
if(sub >= 1){
printf("%d", sub);
for(int i = 0; i < sub; i ++){
printf(" %s", mah[ans[i]]);
}printf("\n");
}else{
printf("Nooten\n");
}
}
}