Problem:
爆弾の連鎖

縦 8、横 8 のマスからなる図1 のような平面があります。その平面上に、いくつかの爆弾が置かれています。図2 にその例を示します（● = 爆弾）。

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

●

□

□

●

□

□

□

□

□

□

●

□

□

●

□

□

□

●

□

□

●

□

□

●

□

□

□

●

□

□

●

□

□

□

□

□

□

□

□

□

□

●

□

□

□

●

□

●

□

□

□

●

□

□

●

□

●

□

□

●

□

図1

図2

爆弾が爆発すると、その爆弾の上下左右 3 マスに爆風の影響が及び、それらのマスに置かれている爆弾も連鎖的に爆発します。たとえば、図 3 に示す爆弾が爆発すると図 4 の■のマスに爆風の影響が及びます。

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

●

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

■

□

□

□

□

□

□

□

■

□

□

□

□

□

□

□

■

□

□

□

□

■

■

■

●

■

■

■

□

□

□

□

■

□

□

□

□

□

□

□

■

□

□

□

□

図3

図4

爆弾が置かれている状態と最初に爆発する爆弾の位置を読み込んで、最終的な平面の状態を出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

n
（空行）
データセット 1
（空行）
データセット 2
..
..
データセット n

１行目にデータセットの数 n (n ≤ 20) が与えられます。続いて n 個のデータセットが与えられます。各データセットの直前に１つの空行が与えられます。各データセットは以下の形式で与えられます。

g1,1g2,1...g8,1
g1,2g2,2...g8,2
:
g1,8g2,8...g8,8
X
Y

最初の８行に、平面を表す８つの文字列が与えられます。各文字列は８文字からなる数列で、爆弾が置かれているマスを 1、置かれていないマスを 0 で表します。
続く２行で、最初に爆発する爆弾の X 座標と Y 座標が与えられます。左上、左下、右上、右下の座標が、それぞれ、(1, 1)、(1, 8)、(8, 1)、(8, 8) です。例えば、図 4 に示す爆弾が最初に爆発するとき、与えられる座標は (4, 6) です。

Output

各データセットについて以下のように出力して下さい。

爆発しないで残った爆弾のあるマスを 1、爆弾のないマスを 0 で表現することとします。平面の一行を数字 8 個からなる一行とし 8 行の文字列で最終的な平面の状態を出力してください。各データセットの先頭は、サンプル出力のように Data x: から出力しなければなりません。ここで、x はデータセットの番号です。

Sample Input

2

00010010
00000100
10001001
00100010
01000000
00001000
10100010
01010010
2
5

00010010
00000100
10001001
00100010
01000000
00001000
10100010
01010010
2
5

Output for the Sample Input

Data 1:
00000000
00000100
10001001
00100000
00000000
00001000
10100000
00000000
Data 2:
00000000
00000100
10001001
00100000
00000000
00001000
10100000
00000000

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

namespace AOJ0071
{
    class Program
    {
        static void Main()
        {
            var count = 1;
            foreach (var dataSet in ReadInputs())
            {
                Console.WriteLine("Data {0}:", count);
                var field = ProcessChain(dataSet);

                for (var l = 0; l < 8; l++)
                {
                    for (var c = 0; c < 8; c++)
                    {
                        Console.Write(field[l,c] ? '1' : '0');
                    }
                    Console.WriteLine();
                }

                count++;
            }
        }

        private static bool[,] ProcessChain(DataSet dataSet)
        {
            var queue = new Queue<Point>();
            queue.Enqueue(dataSet.FirstBomb);

            while (queue.Any())
            {
                var point = queue.Dequeue();
                dataSet.Field[point.Y, point.X] = false;

                for (var d = -3; d <= 3; d++)
                {
                    if (point.X + d >= 0 && point.X + d < 8 && dataSet.Field[point.Y, point.X + d])
                    {
                        queue.Enqueue(new Point(point.X + d, point.Y));
                    }

                    if (point.Y + d >= 0 && point.Y + d < 8 && dataSet.Field[point.Y + d, point.X])
                    {
                        queue.Enqueue(new Point(point.X, point.Y + d));
                    }
                }
            }

            return dataSet.Field;
        }

        public static IEnumerable<DataSet> ReadInputs()
        {
            var count = int.Parse(Console.ReadLine() ?? "");
            for (var i = 0; i < count; i++)
            {
                Console.ReadLine();

                var field = new bool[8,8];
                for (var l = 0; l < 8; l++)
                {
                    var line = (Console.ReadLine() ?? "").ToCharArray();
                    for (var c = 0; c < 8; c++)
                    {
                        field[l, c] = line[c] == '1';
                    }
                }
                var x = int.Parse(Console.ReadLine() ?? "") - 1;
                var y = int.Parse(Console.ReadLine() ?? "") - 1;

                yield return new DataSet(field, new Point(x, y));
            }
        }
    }

    class DataSet
    {
        public Point FirstBomb { get; private set; }
        public bool[,] Field { get; set; }

        public DataSet(bool[,] field, Point firstBomb)
        {
            Field = field;
            FirstBomb = firstBomb;
        }
    }

    class Point
    {
        public int X { get; private set; }
        public int Y { get; private set; }

        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }
    }
}