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;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Lummy
    {
        public static void Main(string[] args)
        {
            string strLine = Console.ReadLine();
            int intDateLength = int.Parse(strLine);
            int[ , ] intNum = new int[intDateLength, 9];
            string[ , ] strMark = new string[intDateLength, 9];
            for (int first = 0; first < intDateLength; first++)
            {
                strLine = Console.ReadLine();
                string[] strNumArr = strLine.Split(' ');
                for (int second = 0; second < strNumArr.Length; second++)
                {
                    intNum[first, second] = int.Parse(strNumArr[second]);
                }
                strLine = Console.ReadLine();
                string[] strTempMark = strLine.Split(' ');
                for (int second = 0; second < strTempMark.Length; second++)
                {
                    strMark[first, second] = strTempMark[second];
                }

            }

            //TestPrint(intDateLength, intNum, strMark);

            List<int> listCount = new List<int>();

            for (int first = 0; first < intDateLength; first++)
            {

                //ソート
                for (int second = 0; second < 9; second++)
                {
                    for (int third = 8; second < third; third--)
                    {
                        if (intNum[first, third] < intNum[first, second])
                        {
                            int intTemp = intNum[first, third];
                            string strTemp = strMark[first, third];
                            intNum[first, third] = intNum[first, second];
                            strMark[first, third] = strMark[first, second];
                            intNum[first, second] = intTemp;
                            strMark[first, second] = strTemp;
                        }
                    }
                }

                //TestPrint(intDateLength, intNum, strMark);

                int intCount = 0;
                List<int> listNGIndex = new List<int>();

                //判定
                for (int second = 0; second < 7; second++)
                {
                    bool bl2Roop = NGJuge(second, listNGIndex);
                    if (bl2Roop)
                    {
                        for (int third = second + 1; third < 8; third++)
                        {
                            bool bl3Roop = NGNextJuge(second, third, listNGIndex);
                            if (bl3Roop)
                            {
                                for (int forth = third + 1; forth < 9; forth++)
                                {
                                    //TestNG(listNGIndex);
                                    bool bl4Roop = NGAfterNextJuge(second, third, forth, listNGIndex);
                                    if (bl4Roop)
                                    {
                                        if (strMark[first, second].Equals(strMark[first, third]) &&
                                            strMark[first, second].Equals(strMark[first, forth]))
                                        {
                                            if (intNum[first, second] == intNum[first, third] &&
                                            intNum[first, second] == intNum[first, forth])
                                            {
                                                intCount++;
                                                listNGIndex.Add(second);
                                                listNGIndex.Add(third);
                                                listNGIndex.Add(forth);
                                                //TestNG(listNGIndex);
                                            }
                                            else if (intNum[first, second] == intNum[first, third] - 1 &&
                                                intNum[first, second] == intNum[first, forth] - 2)
                                            {
                                                intCount++;
                                                listNGIndex.Add(second);
                                                listNGIndex.Add(third);
                                                listNGIndex.Add(forth);
                                                //TestNG(listNGIndex);
                                            }
                                        }
                                        

                                    }
                                }
                            }
                            
                        }
                    }
                    
                }

                if (intCount == 3)
                {
                    listCount.Add(1);
                }
                else
                {
                    listCount.Add(0);
                }


            }
            foreach (int ans in listCount)
            {
                Console.WriteLine(ans);
            }
            Console.ReadKey();
        }

        private static bool NGAfterNextJuge(int second, int third, int forth, List<int> listNGIndex)
        {
            bool blTrue = true;
            foreach (int intNG in listNGIndex)
            {
                if (intNG == second || intNG == third || intNG == forth)
                {
                    blTrue = false;
                }
                
            }
            return blTrue;
        }

        private static bool NGNextJuge(int second, int third, List<int> listNGIndex)
        {
            bool blTrue = true;
            foreach (int intNG in listNGIndex)
            {
                if (intNG == second || intNG == third)
                {
                    blTrue = false;
                }
            }
            return blTrue;
        }

        public static bool NGJuge(int intIndex, List<int> listNGNum)
        {
            bool blTrue = true;

            foreach (int intNG in listNGNum)
            {
                if (intIndex == intNG)
                {
                    blTrue = false;
                    break;
                }
            }
            return blTrue;
        }

        public static void TestPrint(int intDateLength, int[ , ] intNum, string[ , ] strMark)
        {
            for (int first = 0; first < intDateLength; first++)
            {
                for (int second = 0; second < 9; second++)
                {
                    Console.Write(intNum[first, second]);
                    Console.Write(" ");
                }
                Console.WriteLine();
                for (int second = 0; second < 9; second++)
                {
                    Console.Write(strMark[first, second]);
                    Console.Write(" ");
                }
                Console.WriteLine();
            }
        }

        public static void TestNG(List<int> list)
        {
            foreach (int print in list)
            {
                Console.Write(print);
            }
            Console.WriteLine();
        }

    }

    
}