纪念一下超级暴力大枚举

也是因为计蒜之道的衣服而被逼无奈呀,虽然这个大枚举巨超时,肯定过不了,但还是纪念一下。

计蒜之道  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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值