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;
    }
}


解説

列ごと、行ごと、斜めごとの件数を持っておき
件数を増やした場合に、ビンゴ判定してます。