Problem p00343 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

vector<int> AP;
vector<int> AQ;
vector<int> BP;
vector<int> BQ;

bool check(vector<int> AP, int ap, int r) {
  if (AP[ap] == r)
    return true;
  return false;
}

bool dfs(int p, int ap, int aq, int bp, int bq, int l, int r) {
  if (p == 1) { // 先手
    if (ap >= AP.size() && aq >= AQ.size())
      return true; // 先手の勝ち
  } else {
    if (bp >= BP.size() && bq >= BQ.size())
      return false; // 先手の負け
  }

  int cnt = 0;

  if (p == 0) {                 // A 先手の番
    if (check(AP, ap, l - 1)) { // 小さいカードを出せる
      ++cnt;
      if (dfs((p + 1) % 2, ap + 1, aq, bp, bq, l - 1, r))
        return true;
    }
    if (check(AQ, aq, r + 1)) { // 大きいカードを出せる
      ++cnt;
      if (dfs((p + 1) % 2, ap, aq + 1, bp, bq, l, r + 1))
        return true;
    }

    if (cnt == 0) { // パス
      if (dfs((p + 1) % 2, ap, aq, bp, bq, l, r))
        return true;
    }
    return false;
  }

  else { //      B 後手の番
    bool possible = true;
    if (check(BP, bp, l - 1)) {
      ++cnt;
      if (!dfs((p + 1) % 2, ap, aq, bp + 1, bq, l - 1, r))
        possible = false;
    }
    if (check(BQ, bq, r + 1)) {
      ++cnt;
      if (!dfs((p + 1) % 2, ap, aq, bp, bq + 1, l, r + 1))
        possible = false;
    }

    if (cnt == 0) { // パス
      if (!dfs((p + 1) % 2, ap, aq, bp, bq, l, r))
        possible = false;
    }
    return possible;
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int n;
  cin >> n;

  for (int i = 0; i < n; ++i) {
    AP.clear();
    AQ.clear();
    BP.clear();
    BQ.clear();

    bool used[14] = {};
    int input;
    for (int j = 0; j < 6; ++j) {
      cin >> input;
      if (input < 7) {
        AP.push_back(input);
        used[input] = true;
      } else if (7 < input) {
        AQ.push_back(input);
        used[input] = true;
      }
    }
    sort(AQ.begin(), AQ.end());
    sort(AP.begin(), AP.end(), greater<int>());

    for (int j = 6; j >= 1; --j) {
      if (used[j] == false) {
        BP.push_back(j);
      }
    }
    for (int j = 8; j <= 13; ++j) {
      if (used[j] == false) {
        BQ.push_back(j);
      }
    }

    /*
    for(int j = 0;j < AP.size();++j){
            cout << AP[j] << ' ';
    }
    cout << "|";
    for(int j = 0;j < AQ.size();++j){
            cout << AQ[j] << ' ';
    }
    cout << endl;

    for(int j = 0;j < BP.size();++j){
            cout << BP[j] << ' ';
    }
    cout << "|";
    for(int j = 0;j < BQ.size();++j){
            cout << BQ[j] << ' ';
    }
    cout << endl;
    */

    if (dfs(0, 0, 0, 0, 0, 7, 7))
      cout << "yes" << endl;
    else
      cout << "no" << endl;
  }

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

vector<int> AP;
vector<int> AQ;
vector<int> BP;
vector<int> BQ;

bool check(vector<int> AP, int ap, int r) {
  if (AP.size() <= ap)
    return false;
  if (AP[ap] == r)
    return true;
  return false;
}

bool dfs(int p, int ap, int aq, int bp, int bq, int l, int r) {
  if (p == 1) { // 先手
    if (ap >= AP.size() && aq >= AQ.size())
      return true; // 先手の勝ち
  } else {
    if (bp >= BP.size() && bq >= BQ.size())
      return false; // 先手の負け
  }

  int cnt = 0;

  if (p == 0) {                 // A 先手の番
    if (check(AP, ap, l - 1)) { // 小さいカードを出せる
      ++cnt;
      if (dfs((p + 1) % 2, ap + 1, aq, bp, bq, l - 1, r))
        return true;
    }
    if (check(AQ, aq, r + 1)) { // 大きいカードを出せる
      ++cnt;
      if (dfs((p + 1) % 2, ap, aq + 1, bp, bq, l, r + 1))
        return true;
    }

    if (cnt == 0) { // パス
      if (dfs((p + 1) % 2, ap, aq, bp, bq, l, r))
        return true;
    }
    return false;
  }

  else { //      B 後手の番
    bool possible = true;
    if (check(BP, bp, l - 1)) {
      ++cnt;
      if (!dfs((p + 1) % 2, ap, aq, bp + 1, bq, l - 1, r))
        possible = false;
    }
    if (check(BQ, bq, r + 1)) {
      ++cnt;
      if (!dfs((p + 1) % 2, ap, aq, bp, bq + 1, l, r + 1))
        possible = false;
    }

    if (cnt == 0) { // パス
      if (!dfs((p + 1) % 2, ap, aq, bp, bq, l, r))
        possible = false;
    }
    return possible;
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int n;
  cin >> n;

  for (int i = 0; i < n; ++i) {
    AP.clear();
    AQ.clear();
    BP.clear();
    BQ.clear();

    bool used[14] = {};
    int input;
    for (int j = 0; j < 6; ++j) {
      cin >> input;
      if (input < 7) {
        AP.push_back(input);
        used[input] = true;
      } else if (7 < input) {
        AQ.push_back(input);
        used[input] = true;
      }
    }
    sort(AQ.begin(), AQ.end());
    sort(AP.begin(), AP.end(), greater<int>());

    for (int j = 6; j >= 1; --j) {
      if (used[j] == false) {
        BP.push_back(j);
      }
    }
    for (int j = 8; j <= 13; ++j) {
      if (used[j] == false) {
        BQ.push_back(j);
      }
    }

    /*
    for(int j = 0;j < AP.size();++j){
            cout << AP[j] << ' ';
    }
    cout << "|";
    for(int j = 0;j < AQ.size();++j){
            cout << AQ[j] << ' ';
    }
    cout << endl;

    for(int j = 0;j < BP.size();++j){
            cout << BP[j] << ' ';
    }
    cout << "|";
    for(int j = 0;j < BQ.size();++j){
            cout << BQ[j] << ' ';
    }
    cout << endl;
    */

    if (dfs(0, 0, 0, 0, 0, 7, 7))
      cout << "yes" << endl;
    else
      cout << "no" << endl;
  }

  return 0;
}