显示原始代码
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
int record[4][10];
map<char, int> num;
const char type[] = "mspz";
int ans[40][40], cnt[40];
bool check_line(int x) {
bool result = 0;
if (record[x][0] == 0)
return 1;
for (int i = 1; i <= 9; i++)
if (record[x][i] >= 3) {
record[x][i] -= 3;
record[x][0] -= 3;
result = check_line(x);
record[x][i] += 3;
record[x][0] += 3;
if (result)
return 1;
}
if (x != 3)
for (int i = 1; i <= 7; i++)
if (record[x][i] > 0 && record[x][i + 1] > 0 && record[x][i + 2] > 0) {
record[x][i]--;
record[x][i + 1]--;
record[x][i + 2]--;
record[x][0] -= 3;
result = check_line(x);
record[x][i]++;
record[x][i + 1]++;
record[x][i + 2]++;
record[x][0] += 3;
if (result)
return 1;
}
return 0;
}
bool check() {
int mian = 0, dui = 0;
bool result;
for (int i = 0; i < 4; i++) {
result = 0;
if (record[i][0] % 3 == 1)
return 0;
else if (record[i][0] % 3 == 0) {
if (!check_line(i))
return 0;
else
mian += record[i][0] / 3;
} else {
for (int j = 1; j <= 9; j++)
if (record[i][j] >= 2) {
record[i][j] -= 2;
record[i][0] -= 2;
result = check_line(i);
record[i][j] += 2;
record[i][0] += 2;
if (result) {
dui++;
mian += record[i][0] / 3;
break;
}
}
if (!result)
return 0;
}
}
if (mian == 4 && dui == 1)
return 1;
else
return 0;
}
int main() {
int t;
string s;
num['m'] = 0;
num['s'] = 1;
num['p'] = 2;
num['z'] = 3;
scanf("%d", &t);
while (t--) {
memset(record, 0, sizeof(record));
memset(ans, 0, sizeof(ans));
memset(cnt, 0, sizeof(cnt));
cin >> s;
for (int i = 0; i < 14; i++) {
record[num[s[2 * i + 1]]][s[2 * i] - '0']++;
record[num[s[2 * i + 1]]][0]++;
}
if (check())
printf("Tsumo!\n");
else {
int tot = 0;
bool result;
for (int i = 0; i < 4; i++)
for (int j = 1; j <= 9; j++)
if (record[i][j]) {
int x = i * 10 + j;
record[i][j]--;
record[i][0]--;
for (int r = 0; r < 4; r++)
for (int c = 1; c <= (r == 3 ? 7 : 9); c++) {
int y = r * 10 + c;
record[r][c]++;
record[r][0]++;
result = check();
record[r][c]--;
record[r][0]--;
if (result) {
if (!cnt[x])
tot++;
ans[x][y] = 1;
cnt[x]++;
}
}
record[i][j]++;
record[i][0]++;
}
printf("%d\n", tot);
for (int i = 0; i < 40; i++) {
if (cnt[i]) {
printf("%d%c ", i % 10, type[i / 10]);
for (int j = 0; j < 40; j++)
if (ans[i][j])
printf("%d%c ", j % 10, type[j / 10]);
printf("\n");
}
}
}
}
return 0;
}