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

import java.util.*;

public class Main{
	int [] vx = {0,1,0,-1,1,1,-1,-1};
	int [] vy = {1,0,-1,0,1,-1,-1,1};
	char [][] data;
	
	private void doit(){
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int n = 8;
			data = new char[n][n];
			for(int i = 0; i < n; i++){
				data[i] = sc.next().toCharArray();
			}
			boolean update = true;
			while(update){
				update = false;
				int max = 0, x = 0, y = 0;
				for(int i = 0; i < n; i++){
					for(int j = 0; j < n; j++){
						if(data[i][j] != '.')continue;
						int temp = find(i,j, 'o');
						if(max < temp){
							max = temp;
							x = j;
							y = i;
						}
					}
				}
				
				if(max > 0){
					update = true;
					data[y][x] = 'o';
					paint(x,y, 'o');
				}
				
				int max2 = 0, x2 = 0, y2 = 0;
				for(int i = n-1; i >= 0; i--){
					for(int j = n-1; j >= 0; j--){
						if(data[i][j] != '.')continue;
						int temp = find(i, j, 'x');
						if(max2 < temp){
							max2 = temp;
							x2 = j;
							y2 = i;
						}
					}
				}
				if(max2 > 0){
					update = true;
					data[y2][x2] = 'x';
					paint(x2,y2,'x');
				}
			}
			disp();
		}
	}

	private void disp() {
		for(int i = 0; i < 8; i++){
			for(int j = 0; j < 8; j++){
				System.out.print(data[i][j]);
			}
			System.out.println();
		}
	}

	private void paint(int x, int y, char c) {
		for(int i = 0; i < vx.length; i++){
			int xx = x + vx[i];
			int yy = y + vy[i];
			boolean flg = false;
			while(true){
				if(! isOK(xx,yy))break;
				if(data[yy][xx] == c){
					flg = true;
					break;
				}
				else if(data[yy][xx] == '.'){
					break;
				}
				xx += vx[i];
				yy += vy[i];
			}
			
			if(flg){
				xx = x + vx[i];
				yy = y + vy[i];
				while(true){
					if(! isOK(xx,yy))break;
					if(data[yy][xx] == c){
						break;
					}
					else if(data[yy][xx] == '.'){
						break;
					}
					data[yy][xx] = c;
					xx += vx[i];
					yy += vy[i];
				}
			}
		}
	}

	private int find(int y, int x, char c) {
		int count = 0;
		for(int i = 0; i < vx.length; i++){
			int xx = x + vx[i];
			int yy = y + vy[i];
			int now = 0;
			while(true){
				if(! isOK(xx,yy))break;
				if(data[yy][xx] == c){
					count += now;
					break;
				}
				else if(data[yy][xx] == '.'){
					break;
				}
				now++;
				xx = xx + vx[i];
				yy = yy + vy[i];
			}
		}
		return count;
	}

	private boolean isOK(int xx, int yy) {
		if(0 <= xx && xx < 8 && 0 <= yy && yy < 8)return true;
		return false;
	}

	private void debug(Object... o) {
		System.out.println("debug = " + Arrays.deepToString(o));
	}

	public static void main(String[] args) {
		new Main().doit();
	}
}