Problem:
必勝７並べ
トランプを使ったゲームに「７並べ」があります。ここではそれを簡単にしたゲームを考えます。１から１３の番号がそれぞれ書かれた１３枚のカードを使って７並べをします。対戦は、２者だけで次のようにゲームを進めます。
「場」に７のカードを置きます。
２者には、残りのカードがランダムに６枚ずつ配布されます。
先手の手持ちのカードのうち、場にあるカードの番号と連続する番号のカードがあれば、そのうちの１枚を場に置きます。プレイヤーはカードが置ける場合には必ず置かなければいけません。無いときに限り、カードを出さずに相手の番になります。
後手も同じ要領で、手持ちのカードを場に置きます。
手順３と４を繰り返して、一方の手持ちのカードがなくなるまで続けます。先に手持ちのカードをすべて場に置けた方が勝者となります。
先手のカードの番号が与えられたとき、後手がどのようにカードを出してきても、先手が勝つ手順が少なくとも一つあるかを判定して出力するプログラムを作成せよ。
Input
入力は以下の形式で与えられる。
N
game
1
game
2
:
game
N
１行目には、ゲームを行う回数
N
(1 ≤
N
≤ 100) が与えられる。続く
N
行に、
i
回目のゲームの情報
game
i
が与えられる。各
game
i
は、以下の形式で与えられる。
f
1
f
2
f
3
f
4
f
5
f
6
f
j
(1 ≤
f
j
≤ 13,
f
j
≠ 7) は先手に配られるカードの番号である。ただし、同じ行に番号が重複して現れることはない（
j
≠
k
について
f
j
≠
f
k
)。
Output
各ゲームについて、後手がどのようにカードを出してきても、先手が勝つ手順が少なくとも一つある場合「yes」、そうでない場合「no」と１行に出力する。
Sample Input 1
5
1 2 3 4 5 6
1 3 5 6 8 4
1 2 3 4 5 8
1 2 4 5 10 11
1 2 3 6 9 11
Sample Output 1
yes
yes
no
yes
no

Submitted solutions:

code_snippet: #include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;

bool judge(vector<int> A, vector<int> B){
  do{
    int i = 0, j = 0;
    int mi = 7, ma = 7;
    while(i < 6 and j < 6){
      if(A[i] == mi-1 or A[i] == ma+1){
        mi = min(A[i],mi), ma = max(ma,A[i]);
        ++i;
      }else{
        for(int k = i+1; k < 6; ++k){
          if(A[k] == mi-1 or A[k] == ma+1){
            i = 0;
            j = 6;
            break;
          }
        }
      }
      if(j == 6) break;
      if(!(B[j] != mi-1 and B[j] != ma+1)){
        mi = min(B[j],mi), ma = max(ma,B[j]);
        ++j;
      }else{
        for(int k = j+1; k < 6; ++k){
          if(B[k] == mi-1 or B[k] == ma+1){
            i = 6;
            break;
          }
        }
      }
    }
    if(i == 6)
      return true;
  }while(next_permutation(A.begin(),A.end()));
  return false;
}


int main(){
  int N;
  cin >> N;
  for(int i = 0; i < N; ++i){
    vector<int> A(6), B;
    set<int> BB{1,2,3,4,5,6,8,9,10,11,12,13};
    for(int i = 0; i < 6; ++i) {
      cin >> A[i];
      BB.erase(A[i]);
    }
    sort(A.begin(),A.end());
    B = vector<int>(BB.begin(), BB.end());
    // for(int i = 1; i <= 13; ++i){
    //   bool f = false;
    //   for(int j = 1; j <= 6; ++j){
    //     if(j == 7){
    //       f = true;
    //       continue;
    //     }
    //     if(A[j] == i){
    //       f = true;
    //       break;
    //     }
    //   }
    //   if(not f) B.push_back(i);
    // }

    // for (auto a: A) cerr << a << " ";
    // cerr << endl;
    // for (auto b: B) cerr << b << " ";
    // cerr << endl;

    string ans = "yes";
    do{
      if(not judge(A,B)){
        ans = "no";
        // for(auto b : B){
        //   cerr << b << " ";
        // }
        // cerr << endl;
        break;
      }
    }while(next_permutation(B.begin(),B.end()));
    cout << ans << endl;
  }
}
accuracy: 0.42857142857142855
time_ms: 110
memory_kb: 3168
final_rank: 4

code_snippet: /*input
5
1 2 3 4 5 6
1 3 5 6 8 4
1 2 3 4 5 8
1 2 4 5 10 11
1 2 3 6 9 11
*/
#include <bits/stdc++.h>
using namespace std;

int dp[30][1 << 13], Alice[13], Bob[13];
int mask1, mask2;

bool solve(int turn, int mask) {
	if(((mask & mask1) == mask1) && ((turn & 1) == 0)) return 1;
	if(((mask & mask2) == mask2) && (turn & 1)) return 0;
	if(dp[turn][mask] != -1) return dp[turn][mask];

	int ans, flag = 0;
	if(turn & 1) {
		ans = 0;
		for(int i = 0; i < 13; ++i) if(i != 6)
			if(Alice[i] && ((mask & (1 << i)) == 0)) {
				int ok = 0;
				if(i > 0) ok |= mask & (1 << (i - 1));
				if(i < 12) ok |= mask & (1 << (i + 1));
				if(ok) ans |= solve(turn + 1, mask | (1 << i)), flag = 1;
			}
		if(!flag) ans = solve(turn + 1, mask);
	}
	else {
		ans = 1;
		for(int i = 0; i < 13; ++i)
			if(Bob[i] && ((mask & (1 << i)) == 0)) {
				int ok = 0;
				if(i > 0) ok |= mask & (1 << (i - 1));
				if(i < 12) ok |= mask & (1 << (i + 1));
				if(ok) ans &= solve(turn + 1, mask | (1 << i)), flag = 1;
			}
		if(!flag) ans = solve(turn + 1, mask);
	}
	return (dp[turn][mask] = ans);
}

int main(){
	int test; scanf("%d", &test);

	while(test --) {
		mask1 = 0, mask2 = 1 << 6;
		memset(dp, - 1, sizeof dp);
		memset(Alice, 0, sizeof Alice);
		memset(Bob, 0, sizeof Bob);

		for(int i = 0; i < 6; ++i) {
			int a; scanf("%d", &a);
			mask1 |= 1 << (a - 1);
			Alice[a - 1] = 1;
		}

		for(int i = 0; i < 13; ++i)
			if((mask1 & (1 << i)) == 0) mask2 |= 1 << i, Bob[i] = 1;

		puts(solve(1, 1 << 6) ? "yes" : "no");
	}
	// cerr << fixed << setprecision(6) << (double)clock() / CLOCKS_PER_SEC << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 4132
final_rank: 3

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

int T, f[2][1 << 13], a_win, b_win;
bool a[2][13];

bool in_mask(int j, int i) {
	if(j < 0 || j > 12) return false;
	if((1 << j) & i) return true;
	return false;
}

int main() {
	cin >> T;
	while(T--) {
		a_win = b_win = 0;
		for(int i = 0; i < 13; ++i) a[0][i] = a[1][i] = false;
		for(int i = 0; i < 6; ++i) {
			int x;
			cin >> x;
			x--;
			a[0][x] = true; a_win += 1 << x;
		}
		for(int i = 0; i < 13; ++i) if(!a[0][i] && i != 6) a[1][i] = true, b_win += 1 << i;
		memset(f, -1, sizeof f);
		for(int i = (1 << 13) - 1; i >= 0; --i) {
			int st = 1, nd = 0; bool flag0 = true;
			for(int j = 0; j < 13; ++j)
				if(a[0][j] && !in_mask(j, i) && (in_mask(j - 1, i) || in_mask(j + 1, i))) {
					//if(i == (1 << 6)) cout << j << endl;
					st = 0, nd = 1, flag0 = false;
				}
			f[st][i] = 0;
			//if(i == (1 << 6)) cout << st << ' ' << nd << ' ' << flag0 << endl;
			for(int j = 0; j < 13; ++j)
				if(a[st][j] && !in_mask(j, i) && (in_mask(j - 1, i) || in_mask(j + 1, i)))
					if(f[nd][i ^ (1 << j)] != -1)
						f[st][i] |= !f[nd][i ^ (1 << j)];
			f[nd][i] = 0; bool flag1 = true;
			for(int j = 0; j < 13; ++j)
				if(a[nd][j] && !in_mask(j, i) && (in_mask(j - 1, i) || in_mask(j + 1, i)))
					if(f[st][i ^ (1 << j)] != -1)
						f[nd][i] |= !f[st][i ^ (1 << j)], flag1 = false;
			if(flag1) f[nd][i] = !f[st][i];
			if((i & a_win) == a_win && (i && b_win) != b_win) f[1][i] = 0;
			if((i & b_win) == b_win && (i && a_win) != a_win) f[0][i] = 0;
		}
		int mask = 0;
		for(int i = 0; i < 6; ++i) mask += 1 << i;
		for(int i = 7; i < 12; ++i) mask += 1 << i;
		if(f[0][1 << 6]) cout << "yes\n"; else cout << "no\n";
	}
}
accuracy: 1
time_ms: 70
memory_kb: 3144
final_rank: 2

code_snippet: #include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;

bool check(vector<int> a) {
  int x=7,y=7;
  for(int i=0; i<6; i++) {
    if(a[i]<7&&a[i]>x) return 0;
    if(a[i]>7&&a[i]<y) return 0;
    x=min(x,a[i]);
    y=max(y,a[i]);
  }
  return 1;
}

int main() {
  int T;
  cin >> T;
  while(T--) {
    vector<int> a(6),b;
    for(int i=0; i<6; i++) cin >> a[i];
    for(int j=1; j<14; j++) {
      if(j==7) continue;
      bool f=1;
      for(int i=0; i<6; i++) if(a[i]==j) f=0;
      if(f) b.push_back(j);
    }
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    do {
      if(!check(a)) continue;
      bool f=1;
      do {
        if(!check(b)) continue;
        P p=P(7,7);
        int x,y;
        bool u[6],u2[6];
        memset(u,0,sizeof(u));
        memset(u2,0,sizeof(u2));
        for(x=0,y=0;x<6&&y<6;) {
          for(int i=0; i<6; i++) {
            if(!u[i]) {
              if(a[i]==p.first-1){p.first--,u[i]=1,x++;break;}
              else if(a[i]==p.second+1){p.second++,u[i]=1,x++;break;}
            }
          }
          for(int i=0; i<6; i++) {
            if(!u2[i]) {
              if(b[i]==p.first-1){p.first--,u2[i]=1,y++;break;}
              else if(b[i]==p.second+1){p.second++,u2[i]=1,y++;break;}
            }
          }
        }
        if(x<6) f=0;
      } while(next_permutation(b.begin(),b.end()));
      if(f) {
        cout << "yes" << endl;
        goto end;
      }
    } while(next_permutation(a.begin(),a.end()));
    cout << "no" << endl;
  end:;
  }
  return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 3148
final_rank: 1