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

ABC-075-B Minesweeper

■■■問題■■■

H×Wのマス目が与えられます。
入力において、全てのマスは文字で表されており、.は空きマス、#は爆弾マスに対応します。
マス目はH個の文字列 S1,・・・,SH で表されます。
文字列Siのj文字目は、マス目の上からi番目、左からj番目のマスに対応します。(1 <= i <= H,1 <= j <= W)

イルカは各空きマスの上下左右および斜めの8方向で隣接しているマスに爆弾マスが何個あるか気になっています。
そこで、各空きマスに対応する.を、
その空きマスの周囲8方向に隣接するマスにおける爆弾マスの個数を表す数字で置き換えることにしました。

以上の規則で置き換えられた後のマス目を出力してください。

■■■入力■■■

H W
S1
・
・
・
SH

●1 <= H,W <= 50
●Siは#と.からなる長さWの文字列

■■■出力■■■

置き換えられた後のマス目をH行の文字列で出力せよ。
i行目に出力する文字列Tiの長さはWであり、
Tiのj文字目は、置き換えられた後のマス目の上からi番目、左からj番目のマスに対応させよ。
(1 <= i <= H,1 <= j <= W)


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "Input1";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("3 5");
            WillReturn.Add(".....");
            WillReturn.Add(".#.#.");
            WillReturn.Add(".....");
            //11211
            //1#2#1
            //11211
            //例として、上から1番目、左から1番目の空きマスに注目します。
            //この空きマスの周囲の8マスに含まれる爆弾マスは、上から2番目、左から2番目のマスのみです。
            //したがって、上から1番目、左から1番目の空きマスは1に置き換えられています。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3 5");
            WillReturn.Add("#####");
            WillReturn.Add("#####");
            WillReturn.Add("#####");
            //#####
            //#####
            //#####
            //空きマスが存在しない場合があります
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("6 6");
            WillReturn.Add("#####.");
            WillReturn.Add("#.#.##");
            WillReturn.Add("####.#");
            WillReturn.Add(".#..#.");
            WillReturn.Add("#.##..");
            WillReturn.Add("#.#...");
            //#####3
            //#8#7##
            //####5#
            //4#65#2
            //#5##21
            //#4#310
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static int UB_X;
    static int UB_Y;

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

        UB_X = InputList[1].Length - 1;
        UB_Y = InputList.Count - 2;

        char[,] BanArr = new char[UB_X + 1, UB_Y + 1];
        for (int LoopX = 0; LoopX <= UB_X; LoopX++) {
            for (int LoopY = 0; LoopY <= UB_Y; LoopY++) {
                BanArr[LoopX, LoopY] = InputList[LoopY + 1][LoopX];
            }
        }

        Func<int, int, bool> IsMineFunc = (pX, pY) =>
        {
            if (pX < 0 || UB_X < pX) return false;
            if (pY < 0 || UB_Y < pY) return false;
            return BanArr[pX, pY] == '#';
        };

        char[,] AnswerArr = new char[UB_X + 1, UB_Y + 1];

        for (int LoopX = 0; LoopX <= UB_X; LoopX++) {
            for (int LoopY = 0; LoopY <= UB_Y; LoopY++) {
                if (BanArr[LoopX, LoopY] == '#') {
                    AnswerArr[LoopX, LoopY] = '#';
                    continue;
                }
                int MineCnt = 0;
                if (IsMineFunc(LoopX - 1, LoopY - 1)) MineCnt++;
                if (IsMineFunc(LoopX - 1, LoopY)) MineCnt++;
                if (IsMineFunc(LoopX - 1, LoopY + 1)) MineCnt++;
                if (IsMineFunc(LoopX, LoopY - 1)) MineCnt++;
                if (IsMineFunc(LoopX, LoopY + 1)) MineCnt++;
                if (IsMineFunc(LoopX + 1, LoopY - 1)) MineCnt++;
                if (IsMineFunc(LoopX + 1, LoopY)) MineCnt++;
                if (IsMineFunc(LoopX + 1, LoopY + 1)) MineCnt++;
                AnswerArr[LoopX, LoopY] = (char)('0' + MineCnt);
            }
        }
        PrintBan(AnswerArr);
    }

    static void PrintBan(char[,] pBanArr)
    {
        var sb = new System.Text.StringBuilder();

        for (int Y = 0; Y <= UB_Y; Y++) {
            for (int X = 0; X <= UB_X; X++) {
                sb.Append(pBanArr[X, Y]);
            }
            sb.AppendLine();
        }
        Console.Write(sb.ToString());
    }
}


解説

ナイーブに実装してます。