Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

必勝７並べ

トランプを使ったゲームに「７並べ」があります。ここではそれを簡単にしたゲームを考えます。１から１３の番号がそれぞれ書かれた１３枚のカードを使って７並べをします。対戦は、２者だけで次のようにゲームを進めます。

「場」に７のカードを置きます。

２者には、残りのカードがランダムに６枚ずつ配布されます。

先手の手持ちのカードのうち、場にあるカードの番号と連続する番号のカードがあれば、そのうちの１枚を場に置きます。プレイヤーはカードが置ける場合には必ず置かなければいけません。無いときに限り、カードを出さずに相手の番になります。

後手も同じ要領で、手持ちのカードを場に置きます。

手順３と４を繰り返して、一方の手持ちのカードがなくなるまで続けます。先に手持ちのカードをすべて場に置けた方が勝者となります。

先手のカードの番号が与えられたとき、後手がどのようにカードを出してきても、先手が勝つ手順が少なくとも一つあるかを判定して出力するプログラムを作成せよ。

Input

入力は以下の形式で与えられる。

N
game1
game2
:
gameN

１行目には、ゲームを行う回数 N (1 ≤ N ≤ 100) が与えられる。続く N 行に、i 回目のゲームの情報 gamei が与えられる。各 gamei は、以下の形式で与えられる。

f1 f2 f3 f4 f5 f6

fj (1 ≤ fj ≤ 13, fj ≠ 7) は先手に配られるカードの番号である。ただし、同じ行に番号が重複して現れることはない（j ≠ k について fj ≠ fk)。

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

Solution in C# (judge verdict: Accepted)

using System.Linq;
using System.Collections.Generic;
using System;

public class P
{
    public List<int> a1 { get; set; }
    public List<int> a2 { get; set; }
}

public class hello
{
    public static void Main()
    {

        var n = int.Parse(Console.ReadLine().Trim());
        for (int i = 0; i < n; i++)
        {
            var p1 = new P { a1 = new List<int>(), a2 = new List<int>() };
            var p2 = new P { a1 = new List<int>(), a2 = new List<int>() };
            string[] line = Console.ReadLine().Trim().Split(' ');
            var a = Array.ConvertAll(line, int.Parse);
            getP2(a, p2);
            getP1(a, p1);
            Console.WriteLine(getAns(p1, p2) ? "yes" : "no");
        }
    }
    static bool getAns(P p1, P p2)
    {
        if (p1.a1.Count() > 0 && p1.a1.Min() == 1 && p1.a2.Count() > 0 && p1.a2.Max() == 13) return false;
        if (p2.a1.Count() > 0 && p2.a1.Min() == 1 && p2.a2.Count() > 0 && p2.a2.Max() == 13) return true;
        var c = new bool[14];
        c[7] = true;
        int f1;
        if (p1.a1.Count() > 0 && p1.a1.Min() == 1) f1 = 1;
        else f1 = 2;
        var f2 = f1 == 1 ? 2 : 1;
        while (true)
        {
            goSim(p1, c, f1);
            if (p1.a1.Count() == 0 && p1.a2.Count() == 0) return true;
            goSim(p2, c, f2);
            if (p2.a1.Count() == 0 && p2.a2.Count() == 0) return false;
        }
    }
    static void goSim(P p, bool[] c, int t)
    {
        if (t == 1)
        {
            var a1c = p.a1.Count();
            if (a1c > 0 && c[p.a1[a1c - 1] + 1]) { c[p.a1[a1c - 1]] = true; p.a1.RemoveAt(a1c - 1); return; }
            else
            {
                if (p.a2.Count() > 0 && c[p.a2[0] - 1]) { c[p.a2[0]] = true; p.a2.RemoveAt(0); return; }
                else return;
            }
        }
        else
        {
            if (p.a2.Count() > 0 && c[p.a2[0] - 1]) { c[p.a2[0]] = true; p.a2.RemoveAt(0); return; }
            else
            {
                var a1c = p.a1.Count();
                if (a1c > 0 && c[p.a1[a1c - 1] + 1]) { c[p.a1[a1c - 1]] = true; p.a1.RemoveAt(a1c - 1); return; }
                else return; ;
            }
        }
    }
    static void getP1(int[] a, P p1)
    {
        Array.Sort(a);
        for (int i = 0; i < 6; i++)
            if (a[i] <= 6) p1.a1.Add(a[i]);
            else p1.a2.Add(a[i]);
    }
    static void getP2(int[] a, P p2)
    {
        for (int i = 1; i <= 6; i++)
            if (!a.Contains(i)) p2.a1.Add(i);
        for (int i = 8; i <= 13; i++)
            if (!a.Contains(i)) p2.a2.Add(i);
    }
}