#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;
const int maxn = 34;
const char* majiang[] = {
"1T", "2T", "3T", "4T", "5T", "6T", "7T", "8T", "9T",
"1S", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S",
"1W", "2W", "3W", "4W", "5W", "6W", "7W", "8W", "9W",
"DONG", "NAN", "XI", "BEI",
"ZHONG", "FA", "BAI"
};
int ch[maxn+5];
int Find(char *s) {
for(int i = 0; i < maxn; ++i) {
if(strcmp(s, majiang[i]) == 0) return i;
}
return -1;
}
bool judge(int d) {
//printf("%d ", d);
for(int i = 0; i < maxn; ++i) { //ke zi
if(ch[i] >= 3) {
if(d >= 3) return true;
ch[i] -= 3;
if(judge(d + 1)) return true;
ch[i] += 3;
}
}
for(int i = 0; i < maxn - 10; ++i) {
if(i % 9 <= 6 && ch[i] >= 1 && ch[i+1] >= 1 && ch[i+2] >= 1) {
--ch[i]; --ch[i+1]; --ch[i+2];
if(d >= 3) return true;
if(judge(d + 1)) return true;
++ch[i]; ++ch[i+1]; ++ch[i+2];
}
}
return false;
}
bool check() {
for(int i = 0; i < maxn; ++i) {
//printf("%d ", ch[i]);
if(ch[i] >= 2) {
ch[i] -= 2;
if(judge(0)) return true;
ch[i] += 2;
}
}
return false;
}
int main() {
char s[10] = {0};
int mj[20] = {0};
int kase = 0;
while(scanf("%s", s) != EOF) {
if(s[0] == '0') break;
mj[0] = Find(s);
for(int i = 1; i < 13; ++i) {
scanf("%s", s);
mj[i] = Find(s);
}
// for(int i = 0; i < 13; ++i)
// printf("%d ", mj[i]);
// printf("\n");
bool ok = false;
printf("Case %d:", ++kase);
// for(int i = 0; i < maxn; ++i) printf("%d ", ch[i]);
// printf("\n");
for(int i = 0; i < maxn; ++i) {
memset(ch, 0, sizeof(ch));
for(int j = 0; j < 13; ++j) ++ch[mj[j]];
if(ch[i] >= 4) continue;
++ch[i];
//printf("asda");
if(check()) {
ok = true;
printf(" %s", majiang[i]);
}
--ch[i];
}
if(!ok) printf(" Not ready\n");
else printf("\n");
}
return 0;
}
11210 - Chinese Mahjong
最新推荐文章于 2024-12-30 14:24:12 发布