トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.24 数当てゲーム

■■■問題■■■

太郎君と二郎君はゲームをしています。

まず最初に二郎君は0から9までの数字を1つ、心の中で思い浮かべます。

太郎君は、重複しないような0から9までの数字から4つ二郎君に提示し、
二郎君は心の中で思い浮かべた数字が、提示された4つの数字の中にあればYES、
無ければNOと答えます。
これを1ターンとし、次のターンにまた太郎君は4つの数字を提示することを繰り返します。
前に出した数字と同じ数字を提示しても構いません。

入力に太郎君が提示した数字と、二郎君の答えが与えられるので、
二郎君が思い浮かべたであろう数字を出力してください。
必ず出力する数字が1つと確定できるような入力が与えられます。

■■■入力■■■

N
A1 B1 C1 D1 R1
A2 B2 C2 D2 R2
・・・
AN BN CN DN RN

1行目に、ターン数を表すN (2 <= N <= 6) が与えられます。
続くN行に、太郎君が提示した4つの数字 Ai,Bi,Ci,Di (0 <= Ai,Bi,Ci,Di <= 9, 1 <= i <= N) と
二郎君の答えの文字列 Ri (YES または NO) が半角スペース区切りで与えられます。
(Ai,Bi,Ci,Diは互いに異なる)

■■■出力■■■

二郎君が思い浮かべたであろう数字を出力してください。
最後に改行してください。 


C#のソース

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

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("3");
            WillReturn.Add("1 2 4 3 NO");
            WillReturn.Add("8 5 6 7 NO");
            WillReturn.Add("0 1 2 3 NO");
            //9
            //0から8までの中に含まれていないので、残りの9が答えです
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("2");
            WillReturn.Add("1 2 3 4 YES");
            WillReturn.Add("4 5 6 7 YES");
            //4
            //1,2,3,4と4,5,6,7の中で重複している数字は4だけなので、答えが確定します
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("4");
            WillReturn.Add("2 6 5 3 NO");
            WillReturn.Add("1 0 4 7 YES");
            WillReturn.Add("1 7 8 4 YES");
            WillReturn.Add("7 1 9 8 NO");
            //4
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    struct SyuugouInfo
    {
        internal IEnumerable<int> NumEnum;
        internal string Result;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        var SyuugouInfoList = new List<SyuugouInfo>();
        foreach (string EachStr in InputList.Skip(1)) {
            string[] wkArr = EachStr.Split(' ').ToArray();

            SyuugouInfo WillAdd;
            WillAdd.NumEnum = wkArr.Take(4).Select(X => int.Parse(X));
            WillAdd.Result = wkArr.Last();
            SyuugouInfoList.Add(WillAdd);
        }

        var NumSet = new HashSet<int>(Enumerable.Range(0, 10));
        foreach (SyuugouInfo EachSyuugouInfo in SyuugouInfoList) {
            if (EachSyuugouInfo.Result == "YES")
                NumSet.IntersectWith(EachSyuugouInfo.NumEnum);
            if (EachSyuugouInfo.Result == "NO")
                NumSet.ExceptWith(EachSyuugouInfo.NumEnum);
        }
        Console.WriteLine(NumSet.First());
    }
}


解説

HashSetで候補となる数値の集合を管理してます。