AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC355-C Bingo 2
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("3 5");
WillReturn.Add("5 1 8 9 7");
//4
}
else if (InputPattern == "Input2") {
WillReturn.Add("3 5");
WillReturn.Add("4 2 9 7 5");
//-1
}
else if (InputPattern == "Input3") {
WillReturn.Add("4 12");
WillReturn.Add("13 9 6 5 2 7 16 14 8 3 10 11");
//9
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static int mN;
static int UB;
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(pX => int.Parse(pX)).ToArray();
mN = wkArr[0];
UB = mN - 1;
int[] AArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
// 数値の個数[X座標]なDict
var TateCntDict = new Dictionary<int, int>();
// 数値の個数[Y座標]なDict
var YokoCntDict = new Dictionary<int, int>();
for (int I = 0; I <= UB; I++) {
TateCntDict[I] = 0;
YokoCntDict[I] = 0;
}
int Line1Cnt = 0;
int Line2Cnt = 0;
for (int I = 0; I <= AArr.GetUpperBound(0); I++) {
int CurrVal = AArr[I];
int TargetX = (CurrVal - 1) % mN;
TateCntDict[TargetX]++;
if (TateCntDict[TargetX] == mN) {
Console.WriteLine(I + 1); return;
}
int TargetY = (CurrVal - 1) / mN;
YokoCntDict[TargetY]++;
if (YokoCntDict[TargetY] == mN) {
Console.WriteLine(I + 1); return;
}
if (IsLine1(CurrVal)) {
if (++Line1Cnt == mN) {
Console.WriteLine(I + 1); return;
}
}
if (IsLine2(CurrVal)) {
if (++Line2Cnt == mN) {
Console.WriteLine(I + 1); return;
}
}
}
Console.WriteLine(-1);
}
// 右下のラインかを判定
static bool IsLine1(int pVal)
{
int Mod = (pVal - 1) % (mN + 1);
return Mod == 0;
}
// 左下のラインかを判定
static bool IsLine2(int pVal)
{
if (pVal - 1 == 0) return false;
if (pVal == mN * mN) return false;
int Mod = (pVal - 1) % (mN - 1);
return Mod == 0;
}
}
解説
列ごと、行ごと、斜めごとの件数を持っておき
件数を増やした場合に、ビンゴ判定してます。