Problem:
Problem C: ラミー

あなたの友達は最近 UT-Rummy というカードゲームを思いついた．

このゲームで使うカードには赤・緑・青のいずれかの色と1から9までのいずれかの番号が
つけられている．
このゲームのプレイヤーはそれぞれ9枚の手札を持ち，
自分のターンに手札から1枚選んで捨てて，
代わりに山札から1枚引いてくるということを繰り返す．
このように順番にターンを進めていき，
最初に手持ちのカードに3枚ずつ3つの「セット」を作ったプレイヤーが勝ちとなる．
セットとは，同じ色の3枚のカードからなる組で，すべて同じ数を持っているか
連番をなしているもののことを言う．
連番に関しては，番号の巡回は認められない．
例えば，7, 8, 9は連番であるが 9, 1, 2は連番ではない．

あなたの友達はこのゲームをコンピュータゲームとして売り出すという計画を立てて，
その一環としてあなたに勝利条件の判定部分を作成して欲しいと頼んできた．
あなたの仕事は，手札が勝利条件を満たしているかどうかを判定する
プログラムを書くことである．

Input

入力の1行目にはデータセット数を表す数 T
(0 < T ≤ 50) が与えられる．
この行に引き続き T 個のデータセットが与えられる．

各データセットは2行からなり，
1行目には i 番目
(i = 1, 2, ..., 9)
のカードの数字 ni
がそれぞれスペースで区切られて与えられ，
2行目には i 番目のカードの色を表す文字
ci
がそれぞれスペースで区切られて与えられる．
カードの数字
ni
は 1 ≤ ni ≤ 9
を満たす整数であり，
カードの色 ci
はそれぞれ “R”, “G”,
“B”
のいずれかの文字である．

1つのデータセット内に色と数字がともに同じカードが5枚以上出現することはない．

Output

各データセットにつき，勝利条件を満たしていれば
“1”，
そうでなければ “0” と出力せよ．

Sample Input

5
1 2 3 3 4 5 7 7 7
R R R R R R G G G
1 2 2 3 4 4 4 4 5
R R R R R R R R R
1 2 3 4 4 4 5 5 5
R R B R R R R R R
1 1 1 3 4 5 6 6 6
R R B G G G R R R
2 2 2 3 3 3 1 1 1
R G B R G B R G B

Output for the Sample Input

1
0
0
0
1

Solution in C# (judge verdict: Accepted)

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

/// <summary>
/// AOJ RUMMY????????°??????
/// </summary>
class Program
{
    /// <summary>
    /// ????????°????????¨????????????????????????
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        //???????????°??????
        int loopCount = int.Parse(Console.ReadLine());
         
        //???????????¨????????????????????????????????°?????°?????????  
        for(int i = 0; i < loopCount; i++)
        {
            //????????????????????????
            int[] cardNums = Console.ReadLine().Split(' ').Select(s => int.Parse(s)).ToArray();

            //?????????????????????
            string[] cardColors = Console.ReadLine().Split(' ');

            //?????????????????????????????????????????????(??\??????????????§?????????????????????????????´????????????????????£????????????)
            List<Card> cards = GetCardList(cardNums, cardColors);

            //??????????????????????°?????????????????????????
            SortCard(cards);

            //?????£???????????????????????????????????¨?????????????????¨??????
            CheckCombinationWin(cards);

            //?????????????????????????????¨??????????¢????
            Console.WriteLine(CheckUsedCard(cards) ? "1" : "0");
        }
    }

    private static List<Card> GetCardList(int[] cardNums, string[] cardColors)
    {
        List<Card> cards = new List<Card>();

        for (int cardCount = 0; cardCount < cardNums.Length; cardCount++)
            cards.Add(new Card(cardNums[cardCount], cardColors[cardCount]));

        return cards;
    }

    /// <summary>
    /// ??????????????°???????°??????????????????????
    /// </summary>
    private static void SortCard(List<Card> cards)
    {
        //??????????????????????????¨

        for (int i = 0; i < cards.Count - 1; i++)
        {
            for (int j = cards.Count - 1; j > i; j--)
            {
                if (cards[j].number < cards[j - 1].number)
                {
                    Card card = cards[j];
                    cards[j] = cards[j - 1];
                    cards[j - 1] = card;
                }
            }
        }
    }

    /// <summary>
    /// ??¨???????????????????????¨?????????????¢????
    /// </summary>
    /// <param name="cards"></param>
    /// <returns></returns>
    private static bool CheckUsedCard(List<Card> cards)
    {
        bool isWin = true;

        foreach (Card card in cards)
            if (!card.isUsed)
                isWin = false;

        return isWin;
    }

    /// <summary>
    /// ????????£?????????????????????????????????????????£????????????????????¨???????????????
    /// </summary>
    /// <param name="cards"></param>
    private static void CheckCombinationWin(List<Card> cards)
    {
        //checkCount=0???????????£????????§??????
        //checkCount=1??????????????????????????§??????
        for (int checkCount = 0; checkCount < 2; checkCount++)
        {
            //??\??????3???for??????????????????????????????????????????????????????
            for (int i = 0; i < cards.Count - 2; i++)
            {
                for (int j = i + 1; j < cards.Count - 1; j++)
                {
                    for (int k = j + 1; k < cards.Count; k++)
                    {
                        //??????????????????????????????????????¨???????¢????
                        if (IsUsedCard(cards[i], cards[j], cards[k]))
                        {
                            //??????????????????????????????????????????????¢????
                            if (IsSameColor(cards[i], cards[j], cards[k]))
                            {
                                if (checkCount == 0)
                                {
                                    //??£????????§?????????????±?????????????????????????????????£???????????£????????????
                                    if (IsContinuityNumber(cards[i], cards[j], cards[k]))
                                    {
                                        SetCardUsed(cards[i], cards[j], cards[k]);
                                    }
                                }
                                else
                                {
                                    //?????????????????§?????????????±????3??????????????????????????????????????£????????????
                                    if (IsSameNumber(cards[i], cards[j], cards[k]))
                                    {
                                        SetCardUsed(cards[i], cards[j], cards[k]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    /// <summary>
    /// ??????????????????????????¨????????????????????????
    /// </summary>
    /// <param name="card1"></param>
    /// <param name="card2"></param>
    /// <param name="card3"></param>
    private static void SetCardUsed(Card card1, Card card2, Card card3)
    {
        card1.isUsed = true;
        card2.isUsed = true;
        card3.isUsed = true;
    }

    /// <summary>
    /// ???????????????????????£??????????¢????
    /// </summary>
    /// <param name="card1"></param>
    /// <param name="card2"></param>
    /// <param name="card3"></param>
    /// <returns></returns>
    private static bool IsContinuityNumber(Card card1, Card card2, Card card3)
    {
        bool isContinuityNumber = false;

        if (card1.number == card2.number - 1 && card1.number == card3.number - 2)
            isContinuityNumber = true;

        return isContinuityNumber;
    }

    /// <summary>
    /// ??????????????????????????????????¢????
    /// </summary>
    /// <param name="card1"></param>
    /// <param name="card2"></param>
    /// <param name="card3"></param>
    /// <returns></returns>
    private static bool IsSameNumber(Card card1, Card card2, Card card3)
    {
        bool isSameNumber = false;

        if (card1.number == card2.number && card1.number == card3.number)
            isSameNumber = true;

        return isSameNumber;
    }

    /// <summary>
    /// ?????????????????????????????¨???????¢????
    /// </summary>
    /// <param name="card1"></param>
    /// <param name="card2"></param>
    /// <param name="card3"></param>
    /// <returns></returns>
    private static bool IsUsedCard(Card card1, Card card2, Card card3)
    {
        bool isUsed = false;

        if (!card1.isUsed && !card2.isUsed && !card3.isUsed)
            isUsed = true;

        return isUsed;
    }

    /// <summary>
    /// ???????????????????????¨????????????????¢????
    /// </summary>
    /// <param name="card1"></param>
    /// <param name="card2"></param>
    /// <param name="card3"></param>
    /// <returns></returns>
    private static bool IsSameColor(Card card1, Card card2, Card card3)
    {
        bool isSameColor = false;

        if (card1.color == card2.color && card2.color == card3.color)
            isSameColor = true;

        return isSameColor;
    }
}

/// <summary>
/// ??????????????????
/// </summary>
public class Card
{
    /// <summary>
    /// ??????????????°???
    /// </summary>
    public int number { get; set; }
    /// <summary>
    /// ???????????????
    /// </summary>
    public string color { get; set; }
    /// <summary>
    /// ?????¨??????????????°
    /// </summary>
    public bool isUsed { get; set; }

    /// <summary>
    /// ?????????????????????
    /// </summary>
    /// <param name="num">???????????????</param>
    /// <param name="color">????????????</param>
    public Card(int num, string color)
    {
        this.number = num;
        this.color = color;
    }
}