也是因为计蒜之道的衣服而被逼无奈呀,虽然这个大枚举巨超时,肯定过不了,但还是纪念一下。
计蒜之道 B题. 个性化评测系统
仅仅纪念一下超庞大枚举麻将代码,大佬勿喷。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define llinf 1ll<<60
using namespace std;
typedef long long ll;
int read() {
int x = 0, f = 1;
int ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + (int)(ch - '0');
ch = getchar();
}
return x * f;
}
void out(ll a) {
if (a < 0) {
putchar('-');
a = -a;
}
if (a >= 10) {
out(a / 10);
}
putchar(a % 10 + '0');
}
string pai[14], p[15], pp[15], lei[4] = {"m", "s", "p", "z"};
int f(string s) {
for (int i = 1; i <= 13; i++)
p[i] = pai[i];
p[14] = s;
sort(p+1, p+15);
string tmp;
for (int i = 1; i <= 14; i++)
tmp += p[i];
//4个刻子和1个对子
for (int i = 1; i <= 9; i++) {
for (int ll1 = 0; ll1 < 4; ll1++) {
if (ll1 == 3 && i > 7) continue;
pp[1] = to_string(i) + lei[ll1], pp[2] = to_string(i) + lei[ll1], pp[3] = to_string(i) + lei[ll1];
for (int j = 1; j <= 9; j++) {
if (i == j) continue;
for (int ll2 = 0; ll2 < 4; ll2++) {
if (ll2 == 3 && j > 7) continue;
pp[4] = to_string(j) + lei[ll2], pp[5] = to_string(j) + lei[ll2], pp[6] = to_string(j) + lei[ll2];
for (int k = 1; k <= 9; k++) {
if (i == k || j == k) continue;
for (int ll3 = 0; ll3 < 4; ll3++) {
if (ll3 == 3 && k > 7) continue;
pp[7] = to_string(k) + lei[ll3], pp[8] = to_string(k) + lei[ll3], pp[9] = to_string(k) + lei[ll3];
for (int l = 1; l <= 9; l++) {
if (i == l || j == l || k == l) continue;
for (int ll4 = 0; ll4 < 4; ll4++) {
if (ll4 == 3 && l > 7) continue;
pp[10] = to_string(l) + lei[ll4], pp[11] = to_string(l) + lei[ll4], pp[12] = to_string(l) + lei[ll4];
for (int d = 1; d <= 9; d++) {
if (i == d || j == d || k == d || l == d) continue;
for (int ll5 = 0; ll5 < 4; ll5++) {
if (ll5 == 3 && d > 7) continue;
pp[13] = to_string(d) + lei[ll5], pp[14] = to_string(d) + lei[ll5];
sort(pp+1, pp+15);
string ttmp;
for (int ss = 1; ss < 15; ss++)
ttmp += pp[ss];
if (tmp == ttmp) return 1;
}
}
}
}
}
}
}
}
}
}
//1个顺子+3个刻子+1个对子
for (int i = 1; i <= 9; i++) {
for (int ll1 = 0; ll1 < 4; ll1++) {
if (ll1 == 3 && i > 7) continue;
pp[1] = to_string(i) + lei[ll1], pp[2] = to_string(i) + lei[ll1], pp[3] = to_string(i) + lei[ll1];
for (int j = 1; j <= 9; j++) {
if (i == j) continue;
for (int ll2 = 0; ll2 < 4; ll2++) {
if (ll2 == 3 && j > 7) continue;
pp[4] = to_string(j) + lei[ll2], pp[5] = to_string(j) + lei[ll2], pp[6] = to_string(j) + lei[ll2];
for (int k = 1; k <= 9; k++) {
if (i == k || j == k) continue;
for (int ll3 = 0; ll3 < 4; ll3++) {
if (ll3 == 3 && k > 7) continue;
pp[7] = to_string(k) + lei[ll3], pp[8] = to_string(k) + lei[ll3], pp[9] = to_string(k) + lei[ll3];
for (int l = 1; l <= 7; l++) {//顺子
for (int ll4 = 0; ll4 < 4; ll4++) {
if (ll4 == 3 && l > 5) continue;
pp[10] = to_string(l) + lei[ll4], pp[11] = to_string(l+1) + lei[ll4], pp[12] = to_string(l+2) + lei[ll4];
for (int d = 1; d <= 9; d++) {
if (i == d || j == d || k == d) continue;
for (int ll5 = 0; ll5 < 4; ll5++) {
if (ll5 == 3 && d > 7) continue;
pp[13] = to_string(d) + lei[ll5], pp[14] = to_string(d) + lei[ll5];
sort(pp+1, pp+15);
string ttmp;
for (int ss = 1; ss < 15; ss++)
ttmp += pp[ss];
if (tmp == ttmp) return 1;
}
}
}
}
}
}
}
}
}
}
//2个顺子+2个刻子+1个对子
map<string, int> m2;
for (int i = 1; i <= 9; i++) {
for (int ll1 = 0; ll1 < 4; ll1++) {
if (ll1 == 3 && i > 7) continue;
pp[1] = to_string(i) + lei[ll1], pp[2] = to_string(i) + lei[ll1], pp[3] = to_string(i) + lei[ll1];
m2[pp[1]]+=3;
for (int j = 1; j <= 9; j++) {
if (i == j) continue;
for (int ll2 = 0; ll2 < 4; ll2++) {
if (ll2 == 3 && j > 7) continue;
pp[4] = to_string(j) + lei[ll2], pp[5] = to_string(j) + lei[ll2], pp[6] = to_string(j) + lei[ll2];
m2[pp[4]]+=3;
for (int k = 1; k <= 7; k++) {//顺子
for (int ll3 = 0; ll3 < 4; ll3++) {
if (ll3 == 3 && k > 5) continue;
pp[7] = to_string(k) + lei[ll3], pp[8] = to_string(k+1) + lei[ll3], pp[9] = to_string(k+2) + lei[ll3];
if (m2[pp[7]] == 4 || m2[pp[8]] == 4 || m2[pp[9]] == 4) continue;
m2[pp[7]]++, m2[pp[8]]++, m2[pp[9]]++;
for (int l = 1; l <= 7; l++) {//顺子
for (int ll4 = 0; ll4 < 4; ll4++) {
if (ll4 == 3 && l > 5) continue;
pp[10] = to_string(l) + lei[ll4], pp[11] = to_string(l+1) + lei[ll4], pp[12] = to_string(l+2) + lei[ll4];
if (m2[pp[10]] == 4 || m2[pp[11]] == 4 || m2[pp[12]] == 4) continue;
m2[pp[10]]++, m2[pp[11]]++, m2[pp[12]]++;
for (int d = 1; d <= 9; d++) {
if (i == d || j == d) continue;
for (int ll5 = 0; ll5 < 4; ll5++) {
if (ll5 == 3 && d > 7) continue;
pp[13] = to_string(d) + lei[ll5], pp[14] = to_string(d) + lei[ll5];
if (m2[pp[13]] == 4 || m2[pp[14]] == 4) continue;
sort(pp+1, pp+15);
string ttmp;
for (int ss = 1; ss < 15; ss++)
ttmp += pp[ss];
if (tmp == ttmp) return 1;
}
}
}
}
}
}
}
}
}
}
//3个顺子+1个刻子+1个对子
map<string, int> m3;
for (int i = 1; i <= 9; i++) {
for (int ll1 = 0; ll1 < 4; ll1++) {
if (ll1 == 3 && i > 7) continue;
pp[1] = to_string(i) + lei[ll1], pp[2] = to_string(i) + lei[ll1], pp[3] = to_string(i) + lei[ll1];
m3[pp[1]]+=3;
for (int j = 1; j <= 7; j++) {//顺子
for (int ll2 = 0; ll2 < 4; ll2++) {
if (ll2 == 3 && j > 5) continue;
pp[4] = to_string(j) + lei[ll2], pp[5] = to_string(j+1) + lei[ll2], pp[6] = to_string(j+1) + lei[ll2];
if (m3[pp[4]] == 4 || m3[pp[5]] == 4 || m3[pp[6]] == 4) continue;
m3[pp[4]]++, m3[pp[5]]++, m3[pp[6]]++;
for (int k = 1; k <= 7; k++) {//顺子
for (int ll3 = 0; ll3 < 4; ll3++) {
if (ll3 == 3 && k > 5) continue;
pp[7] = to_string(k) + lei[ll3], pp[8] = to_string(k+1) + lei[ll3], pp[9] = to_string(k+2) + lei[ll3];
if (m3[pp[7]] == 4 || m3[pp[8]] == 4 || m3[pp[9]] == 4) continue;
m3[pp[7]]++, m3[pp[8]]++, m3[pp[9]]++;
for (int l = 1; l <= 7; l++) {//顺子
for (int ll4 = 0; ll4 < 4; ll4++) {
if (ll4 == 3 && l > 5) continue;
pp[10] = to_string(l) + lei[ll4], pp[11] = to_string(l+1) + lei[ll4], pp[12] = to_string(l+2) + lei[ll4];
if (m3[pp[10]] == 4 || m3[pp[11]] == 4 || m3[pp[12]] == 4) continue;
m3[pp[10]]++, m3[pp[11]]++, m3[pp[12]]++;
for (int d = 1; d <= 9; d++) {
if (i == d || j == d) continue;
for (int ll5 = 0; ll5 < 4; ll5++) {
if (ll5 == 3 && d > 7) continue;
pp[13] = to_string(d) + lei[ll5], pp[14] = to_string(d) + lei[ll5];
if (m3[pp[13]] == 4 || m3[pp[14]] == 4) continue;
sort(pp+1, pp+15);
string ttmp;
for (int ss = 1; ss < 15; ss++)
ttmp += pp[ss];
if (tmp == ttmp) return 1;
}
}
}
}
}
}
}
}
}
}
//0个刻子+4个顺子
map<string, int> m4;
for (int i = 1; i <= 7; i++) {//顺子
for (int ll1 = 0; ll1 < 4; ll1++) {
if (ll1 == 3 && i > 5) continue;
pp[1] = to_string(i) + lei[ll1], pp[2] = to_string(i+1) + lei[ll1], pp[3] = to_string(i+2) + lei[ll1];
m4[pp[1]]++, m4[pp[1]]++, m4[pp[1]]++;
for (int j = 1; j <= 7; j++) {//顺子
for (int ll2 = 0; ll2 < 4; ll2++) {
if (ll2 == 3 && j > 5) continue;
pp[4] = to_string(j) + lei[ll2], pp[5] = to_string(j+1) + lei[ll2], pp[6] = to_string(j+1) + lei[ll2];
if (m4[pp[4]] == 4 || m4[pp[5]] == 4 || m4[pp[6]] == 4) continue;
m4[pp[4]]++, m4[pp[5]]++, m4[pp[6]]++;
for (int k = 1; k <= 7; k++) {//顺子
for (int ll3 = 0; ll3 < 4; ll3++) {
if (ll3 == 3 && k > 5) continue;
pp[7] = to_string(k) + lei[ll3], pp[8] = to_string(k+1) + lei[ll3], pp[9] = to_string(k+2) + lei[ll3];
if (m4[pp[7]] == 4 || m4[pp[8]] == 4 || m4[pp[9]] == 4) continue;
m4[pp[7]]++, m4[pp[8]]++, m4[pp[9]]++;
for (int l = 1; l <= 7; l++) {//顺子
for (int ll4 = 0; ll4 < 4; ll4++) {
if (ll4 == 3 && l > 5) continue;
pp[10] = to_string(l) + lei[ll4], pp[11] = to_string(l+1) + lei[ll4], pp[12] = to_string(l+2) + lei[ll4];
if (m4[pp[10]] == 4 || m4[pp[11]] == 4 || m4[pp[12]] == 4) continue;
m4[pp[10]]++, m4[pp[11]]++, m4[pp[12]]++;
for (int d = 1; d <= 9; d++) {
if (i == d || j == d) continue;
for (int ll5 = 0; ll5 < 4; ll5++) {
if (ll5 == 3 && d > 7) continue;
pp[13] = to_string(d) + lei[ll5], pp[14] = to_string(d) + lei[ll5];
if (m4[pp[13]] == 4 || m4[pp[14]] == 4) continue;
sort(pp+1, pp+15);
string ttmp;
for (int ss = 1; ss < 15; ss++)
ttmp += pp[ss];
if (tmp == ttmp) return 1;
}
}
}
}
}
}
}
}
}
}
return 0;
}
int main() {
while (cin >> pai[1] >> pai[2] >> pai[3] >> pai[4] >> pai[5] >> pai[6] >> pai[7] >> pai[8] >> pai[9] >> pai[10] >> pai[11] >> pai[12] >> pai[13]) {
map<string, int> m;
for (int i = 1; i <= 13; i++)
m[pai[i]]++;
string add;
for (int i = 1; i <= 9; i++) {
add = to_string(i) + "m";
if (m[add] == 4) continue;
if (f(add)) cout << add << endl;
}
for (int i = 1; i <= 9; i++) {
add = to_string(i) + "s";
if (m[add] == 4) continue;
if (f(add)) cout << add << endl;
}
for (int i = 1; i <= 9; i++) {
add = to_string(i) + "p";
if (m[add] == 4) continue;
if (f(add)) cout << add << endl;
}
for (int i = 1; i <= 7; i++) {
add = to_string(i) + "z";
if (m[add] == 4) continue;
if (f(add)) cout << add << endl;
}
}
return 0;
}