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 JavaScript (judge verdict: Accepted)

var dx = [1,1,1,0,0,-1,-1,-1];
var dy = [1,0,-1,1,-1,1,0,-1];

function judge(s,turn,ii,jj){
    var sum = 0;
    for(var i = 0;i < 8;i++){
        var su = 0;
        var x = jj + dx[i],y = ii + dy[i];
        while(x > 0 && x < 9 && y > 0 && y < 9){
            if(s[y][x] == turn){sum += su;break;}
            else if(s[y][x] == turn * (-1))su++;
            else
                break;
            x += dx[i];y += dy[i];
        }
    }
    return sum;
}

function put(s,turn,ii,jj){
    for(var i = 0;i < 8;i++){
        var su = 0;
        var x = jj + dx[i],y = ii + dy[i];
        var flag = false;
        while(x > 0 && x < 9 && y > 0 && y < 9){
            if(s[y][x] == turn){flag = true;break;}
            else if(s[y][x] == turn * (-1))su++;
            else
                break;
            x += dx[i];y += dy[i];
        }
        if(flag){
            var x = jj + dx[i],y = ii + dy[i];
            for(var j = 0;j < su;j++){
                s[y][x] = turn;
                x += dx[i];y += dy[i];
            }
        }
    }
    s[ii][jj] = turn;
}



function Main(input){
    input = input.split("\n");
    var s = [];
    for(var i = 1;i <= 8;i++){
        s[i] = [];
    }

    var fin = 0;

    for(var i = 1;i <= 8;i++){
        for(var j = 1;j <= 8;j++){
            if(input[i - 1][j - 1] == 'o'){
                fin++;
                s[i][j] = 1;
            }
            else if (input[i - 1][j - 1] == 'x'){
                fin++;
                s[i][j] = -1;
            }
            else
                s[i][j] = 0;
        }
    }

    var turn = 1;var aaa = false;

    while(fin < 64){
        var maxi = 0,imax = -1,jmax = -1;
        if(turn == 1){
            for(var i = 1;i <= 8;i++){
                for(var j = 1;j <= 8;j++){
                    if(s[i][j] == 0){
                        var a = judge(s,turn,i,j);
                        if(a > maxi){
                            maxi = a;imax = i;jmax = j;
                        }
                    }
                }
            }
        }else{
            for(var i = 1;i <= 8;i++){
                for(var j = 1;j <= 8;j++){
                    if(s[i][j] == 0){
                        var a = judge(s,turn,i,j);
                        if(a >= maxi){
                            maxi = a;imax = i;jmax = j;
                        }
                    }
                }
            }
        }

        if(maxi > 0){
            aaa = false;
            fin++;
            put(s,turn,imax,jmax);
        }else{
            if(aaa)
                break;
            aaa = true;
        }
        turn *= (-1);
    }

    for(var i = 1;i <= 8;i++){
        var ans = "";
        for(var j = 1;j <= 8;j++){
            if(s[i][j] == 1)
                ans += 'o';
            else if(s[i][j] == (-1))
                ans += 'x';
            else
                ans += '.';
        }
        console.log(ans);
    }
}
Main(require("fs").readFileSync("/dev/stdin","utf8"));