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 Haskell (judge verdict: Wrong Answer)

import Data.List (nub, intersect)
import Data.IntMap (insert, keys, (!), fromList)

main = interact $ unlines . casenum . map (show' . bombs_chain) . read' . tail . lines
 where
  read' [] = []
  read' (_:ls) = let (x:y:xs) = drop 8 ls in ((read x, read y), concat (take 8 ls)) : read' xs
  show' = init . unlines . groupOn 8
  casenum = zipWith (++) (map (\n -> "Data " ++ show n ++ ":\n") [1..])

bombs_chain ((bx,by), board) = foldr (\p acc -> replace acc p '0') board bombed
 where
  pos = (by-1)*8 + bx-1
  bombed = make_shortcuts pos (blast_graph board) ! pos
  blast_graph = fromList . add_blast . coordinates
  add_blast cs = map (\c -> (c, filter (flip in_range c) cs)) cs
  coordinates board = [x | x<-[0..63], is_installed x board]
  is_installed ix board = board !! ix == '1'
  in_range ix bx
   | elem ix $ filter (\x -> div x 8 == div ix 8) [bx-3,bx-2,bx-1,bx+1,bx+2,bx+3] = True
   | elem ix [bx-24, bx-16, bx-8, bx, bx+8, bx+16, bx+24] = True
   | otherwise = False

make_shortcut v im = insert v new im
 where new = nub $ (im!v) ++ concatMap (im !) (intersect (keys im) (im!v))
 
make_shortcuts v im = untilFix (make_shortcut v) im

untilFix f x = if f x == x then x else untilFix f (f x)

replace xs i r = foldr (\x acc -> if (i+1) + length acc == length xs then r:acc else x:acc) [] xs

groupOn n [] = []
groupOn n xs = take n xs : groupOn n (drop n xs)