トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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で候補となる数値の集合を管理してます。