Problem:
問題文

お菓子の魔女 CHARLOTTE は巴マミとクッキーゲームを楽しんでいる．クッキーゲームは 8\times 8 の格子状に区切られたテーブルクロスの上にチーズクッキーとチョコレートクッキーを置いて行われる．各格子には高々 1 個のチョコレートクッキーまたはチーズクッキーしか置くことはできない．

お菓子の魔女はチーズクッキーを，巴マミはチョコレートクッキーを交互に置いてゲームを行う．自分のクッキーを置いたあと，そのクッキーから上下左右斜めの各 8 方向について，置くクッキーとすでに置いていた自分のクッキーの間に相手のクッキーのみが直線に並んでいた場合に，その挟まれた相手のクッキーのすべてが自分のクッキーで置き換えられる．クッキーゲームのプレイヤーは自分のターンが回ってきた時，1 つ自分のクッキーを置くことができる．ただし，相手のクッキーを少なくとも 1 つ以上自分のクッキーに置き換えられなければならない．そのような置き場がない場合，自分のターンをパスをしなければならない．

お菓子の魔女も巴マミも考えるのが少々苦手である．そこで，回ってきたターン毎にそのターンの中で置き換えられるクッキーの数を最大化することを考えることにした．巴マミのターンのときに置き換えられるクッキーの数を最大にするようなクッキーを置く場所の候補が複数ある場合は，より上の場所を，それでも複数ある場合はより左の場所を選択することにした．また同様に，お菓子の魔女のターンのときに候補が複数ある場合はより下の場所を，それでも複数ある場合はより右の場所を選択することにした．

テーブルクロスに置かれたクッキーの状態が与えられるので，巴マミからはじめ，彼女たちがそこからクッキーゲームを行い，共に新たなクッキーが置けなくなるまでゲームを続けた時のテーブルクロスの上に置かれたクッキーの状態を求めよ．

入力形式

入力は以下の形式で与えられる．

s_{11} s_{12} ... s_{18}\\
s_{21} s_{22} ... s_{28}\\
...\\
s_{81} s_{82} ... s_{88}\\

s_{ij} はテーブルクロスに置かれたクッキーの初期状態を表す文字で，上から i 行目，左から j 列目の格子の状態を表す．チョコレートクッキーが置かれているときs_{ij}は 'o' であり，チーズクッキーが置かれているときは 'x', 何も置かれていないときは '.' となる．

出力形式

クッキーゲームが行われた後のテーブルクロスの上に置かれたクッキーの状態を，入力形式と同じ形式で出力せよ．

制約

s_{ij} は 'o', 'x', '.' のいずれかである．

入出力例

入力例 1

ooox....
.x......
ooo.....
........
........
........
........
........

出力例1

ooooo...
.o......
ooo.....
...o....
....o...
........
........
........

入力例 2

........
........
........
...ox...
...xo...
........
........
........

出力例 2

xxxxxxxx
xxxooxxx
xxxxooxx
xxxxxxxx
ooxxooox
ooxoooox
oxooooox
ooooooox

入力例 3

........
........
..ooo...
..oxo...
..ooo...
........
........
........

出力例 3

........
........
..ooo...
..ooo...
..ooo...
.....o..
......o.
........

Problem Setter: Flat35

Solution in Ruby (judge verdict: Accepted)

BLANK = 0
O = 1
X = -1
H = 8
W = 8

def put!(field, y, x, color)
  field[y][x] = color
  dy = [-1, -1, -1, 0, 1, 1, 1, 0]
  dx = [-1, 0, 1, 1, 1, 0, -1, -1]
  8.times do |i|
    ny = y + dy[i]
    nx = x + dx[i]
    count = 0
    while field[ny][nx] == -color do
      count += 1
      ny += dy[i]
      nx += dx[i]
    end
    next if field[ny][nx] != color || count == 0
    ny = y + dy[i]
    nx = x + dx[i]
    while field[ny][nx] == -color do
      field[ny][nx] = color
      ny += dy[i]
      nx += dx[i]
    end
  end
  1
end

def put?(field, y, x, color)
  return 0 if field[y][x] != BLANK
  sum = 0
  dy = [-1, -1, -1, 0, 1, 1, 1, 0]
  dx = [-1, 0, 1, 1, 1, 0, -1, -1]
  8.times do |i|
    ny = y + dy[i]
    nx = x + dx[i]
    count = 0
    while field[ny][nx] == -color do
      count += 1
      ny += dy[i]
      nx += dx[i]
    end
    next if field[ny][nx] != color || count == 0
    sum += count
  end
  sum
end

def mami(field)
  max = y = x = 0
  for i in 1..H do
    for j in 1..W do
      count = put?(field, i, j, O)
      next if max >= count
      max = count
      y = i
      x = j
    end
  end
  max > 0 ? put!(field, y, x, O) : 0
end

def witch(field)
  max = y = x = 0
  H.downto(1) do |i|
    W.downto(1) do |j|
      count = put?(field, i, j, X)
      next if max >= count
      max = count
      y = i
      x = j
    end
  end
  max > 0 ? put!(field, y, x, X) : 0
end

field = Array.new(H+2) {Array.new(W+2, BLANK)}
for i in 1..H do
  field[i][1, W] = gets.chomp.chars.map{|c| c == "o" ? O : (c == "x" ? X : BLANK)}
end

turn = O
pass = 0
while true do
  case turn
    when O
      mami(field) > 0 ? pass = 0 : pass += 1
    when X
      witch(field) > 0 ? pass = 0 : pass += 1
  end
  break if pass == 2
  turn *= -1
end

for i in 1..H do
  field[i][1,W].map{|c| putc c == 0 ? "." : (c == 1 ? "o" : "x")}
  puts
end