Problem p00043 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cstdio>
#include <iostream>

using namespace std;

int check(int *a) {
  int s = 0; // s=0なら全てが揃った
  for (int i = 1; i < 10; i++) {
    s += a[i];
  }
  return s;
}

void solve(int *a, int n, int ans[10]) {
  if (check(a) == 0) { // 完成した
    ans[n] = 1;
    return;
  }
  for (int i = 1; i <= 7; i++) { // まずは順子から探す
    if (a[i] && a[i + 1] && a[i + 2]) {
      a[i]--;
      a[i + 1]--;
      a[i + 2]--;
      solve(a, n, ans);
      a[i]++;
      a[i + 1]++;
      a[i + 2]++;
    }
  }
  for (int i = 1; i <= 9; i++) { // 暗刻を探す
    if (a[i] >= 3) {
      a[i] -= 3;
      solve(a, n, ans);
      a[i] += 3;
    }
  }
}

int main() {
  string s;
  while (cin >> s) {
    int useDigit[10] = {0}; // いくつ使用したかどうか記憶
    int ans[10] = {0};

    if (s.length() != 13) {
      continue;
    }
    for (int i = 0; i < 13; i++) {
      useDigit[s[i] - '0']++;
    }

    for (int i = 1; i <= 9; i++) {
      if (useDigit[i] >= 4) {
        continue;
      } else {
        useDigit[i]++;
        for (int j = 1; j <= 9;
             j++) { // ペアが出来るかどうか判定をして暗刻と順子を探す
          if (useDigit[j] >= 2) {
            useDigit[j] -= 2;
            solve(useDigit, i, ans);
            useDigit[j] += 2;
          }
        }
        useDigit[i]--;
      }
    }
    bool flag = false;
    int Count = 0;
    for (int i = 1; i <= 9; i++) {
      if (ans[i]) { // ans[i]が1なら成功
        Count++;
        flag = true;
      }
    }
    if (!flag) {
      cout << 0 << endl;
    } else {
      for (int i = 1; i <= 9; i++) {
        if (ans[i] == 1) {
          cout << i;
          if (--Count)
            cout << " ";
        }
      }
      cout << endl;
    }
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <iostream>

using namespace std;

int useDigit[10] = {0}; // いくつ使用したかどうか記憶

int check(int *a) {
  int s = 0; // s=0なら全てが揃った
  for (int i = 1; i < 10; i++) {
    s += a[i];
  }
  return s;
}

void solve(int *a, int n, int ans[10]) {
  if (check(a) == 0) { // 完成した
    ans[n] = 1;
    return;
  }
  for (int i = 1; i <= 7; i++) { // まずは順子から探す
    if (a[i] && a[i + 1] && a[i + 2]) {
      a[i]--;
      a[i + 1]--;
      a[i + 2]--;
      solve(a, n, ans);
      a[i]++;
      a[i + 1]++;
      a[i + 2]++;
    }
  }
  for (int i = 1; i <= 9; i++) { // 暗刻を探す
    if (a[i] >= 3) {
      a[i] -= 3;
      solve(a, n, ans);
      a[i] += 3;
    }
  }
}

int main() {
  string s;
  while (cin >> s) {
    if (s.length() != 13) {
      continue;
    }
    for (int i = 0; i < 13; i++) {
      useDigit[s[i] - '0']++;
    }

    int ans[10] = {0};
    for (int i = 1; i <= 9; i++) {
      if (useDigit[i] >= 4) {
        continue;
      } else {
        useDigit[i]++;
        for (int j = 1; j <= 9;
             j++) { // ペアが出来るかどうか判定をして暗刻と順子を探す
          if (useDigit[j] >= 2) {
            useDigit[j] -= 2;
            solve(useDigit, i, ans);
            useDigit[j] += 2;
          }
        }
        useDigit[i]--;
      }
    }
    bool flag = false;
    for (int i = 1; i <= 9; i++) {
      if (ans[i]) { // ans[i]が1なら成功
        flag = true;
      }
    }
    if (!flag) {
      cout << 0 << endl;
    } else {
      for (int i = 1; i <= 9; i++) {
        if (ans[i] == 1) {
          cout << i;
          if (i != 9)
            cout << " ";
        }
      }
    }
  }
  return 0;
}