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

ARC-016-B 音楽ゲーム

■■■問題■■■

楽器を演奏できない高橋君は、音楽ゲームが大好きです。

このゲームでは9個のボタンが存在し、
曲に合わせてボタンをタイミングよく押したり、
押しっぱなしにすることによって楽器を演奏している気分になります。

あなたには高橋くんがプレイした楽曲の譜面が与えられます。
ボタンを押す場所は'x'、押しっぱなしにする部分は'o'で与えられます。他は'.'です。

高橋くんが譜面をミスなくプレイしたとき、ボタンを押した回数を出力してください。

■■■入力■■■

N
x11x12 ・・・ x18x19
x21x22 ・・・ x28x29
・
・
・
xN1xN2 ・・・ xN8xN9

1行目に、譜面の行数を表す整数 N(1 <= N <= 100) が与えられる。
 ●譜面は常に9列であることが保証されている。
2行目からのN行で、高橋くんが遊ぶ譜面が与えられる。 
 ●譜面の種類は'x' 'o' '.' の3種類である。
 ●譜面が'x'のとき、高橋くんはボタンを押す。
 ●譜面が'o'のとき、高橋くんはボタンを押し、同じ列で'o'が続く限り押しっぱなしにする。
 ●譜面が'.'のとき、高橋くんは何もしない。

■■■出力■■■

高橋くんが譜面をミスなくプレイしたとき、ボタンを押した回数を出力せよ。
なお、出力の最後には改行をいれること。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "InputX";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("15");
            WillReturn.Add(".........");
            WillReturn.Add(".x.......");
            WillReturn.Add(".........");
            WillReturn.Add("...x.....");
            WillReturn.Add(".........");
            WillReturn.Add(".......o.");
            WillReturn.Add(".......o.");
            WillReturn.Add(".......o.");
            WillReturn.Add(".........");
            WillReturn.Add("..x.....o");
            WillReturn.Add("........o");
            WillReturn.Add("........o");
            WillReturn.Add("....x...o");
            WillReturn.Add(".x......o");
            WillReturn.Add("........o");
            //7
            //一瞬だけ押す必要がある部分は5つあります。
            //長押しは2つです。
            //合わせて7が答えです。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("6");
            WillReturn.Add("..o..x.o.");
            WillReturn.Add("..o..x.o.");
            WillReturn.Add("..x..o.o.");
            WillReturn.Add("..o..o.o.");
            WillReturn.Add("..o..x.o.");
            WillReturn.Add("..o..x.o.");
            //9
            //一瞬だけ押す必要がある部分は5つあります。
            //'x'が連続している場合、何度もボタンを押す必要があることに注意してください。
            //長押しは4つです。
            //合わせて9が答えです。
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("2");
            WillReturn.Add(".........");
            WillReturn.Add(".........");
            //0
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int N = int.Parse(InputList[0]);
        string[] XArr = new string[N];
        int UB = XArr.GetUpperBound(0);

        for (int I = 0; I <= UB; I++) {
            XArr[I] = InputList[I + 1];
        }

        bool[] IsOArr = new bool[XArr[0].Length];

        int Answer = 0;
        for (int Y = 0; Y <= UB; Y++) {
            for (int X = 0; X <= XArr[Y].Length - 1; X++) {
                if (XArr[Y][X] == 'x')
                    Answer++;
                if (XArr[Y][X] == 'o') {
                    if (IsOArr[X] == false) {
                        IsOArr[X] = true;
                        Answer++;
                    }
                }
                else IsOArr[X] = false;
            }
        }
        Console.WriteLine(Answer);
    }
}


解説

ナイーブにシュミレーションしてます。