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.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		int[][] grid = new int[8][8];// oなら1、xなら-1を入れておく
		int[] dir = { -1, 0, 1 };

		for (int i = 0; i < grid.length; i++) {
			String line = scanner.next();
			for (int j = 0; j < grid[i].length; j++) {
				char piece = line.charAt(j);
				if (piece == 'o') {
					grid[i][j] = 1;
				} else if (piece == 'x') {
					grid[i][j] = -1;
				}
			}
		}

		int turn = 0;
		int pass = 0;
		while (pass < 2) {
			int max = 0;
			int x = -1;
			int y = -1;
			int me = 1;
			if (turn % 2 == 1) {
				me = -1;
			}
			for (int i = 0; i < grid.length; i++) {
				for (int j = 0; j < grid[i].length; j++) {
					int gain = 0;
					int pi = i;
					int pj = j;
					if (turn % 2 == 1) {
						pi = 7 - i;
						pj = 7 - j;
					}
					if (grid[pi][pj] != 0) {
						continue;
					}

					for (int d1 = 0; d1 < dir.length; d1++) {
						for (int d2 = 0; d2 < dir.length; d2++) {
							if (dir[d1] == 0 && dir[d2] == 0) {
								continue;
							}
							int distance = 1;
							while (pi + dir[d1] * distance >= 0
									&& pi + dir[d1] * distance < 8
									&& pj + dir[d2] * distance >= 0
									&& pj + dir[d2] * distance < 8) {
								if (grid[pi + dir[d1] * distance][pj + dir[d2]
										* distance] == -1 * me) {
									distance++;
								} else if (grid[pi + dir[d1] * distance][pj
										+ dir[d2] * distance] == me) {
									gain += distance - 1;
									break;
								} else {
									break;
								}
							}
						}
					}

					if (max < gain) {
						max = gain;
						x = pi;
						y = pj;
					}

				}

			}
			if (x != -1) {
				pass = 0;
				grid[x][y] = me;
				for (int d1 = 0; d1 < dir.length; d1++) {
					for (int d2 = 0; d2 < dir.length; d2++) {
						if (dir[d1] == 0 && dir[d2] == 0) {
							continue;
						}
						int distance = 1;
						while (x + dir[d1] * distance >= 0
								&& x + dir[d1] * distance < 8
								&& y + dir[d2] * distance >= 0
								&& y + dir[d2] * distance < 8) {
							if (grid[x + dir[d1] * distance][y + dir[d2]
									* distance] == -1 * me) {
								distance++;
							} else if (grid[x + dir[d1] * distance][y + dir[d2]
									* distance] == me) {
								for (int dist = 1; dist < distance; dist++) {
									grid[x + dir[d1] * dist][y + dir[d2] * dist] = me;
								}
								break;
							} else {
								break;
							}
						}
					}
				}
			} else {
				pass++;
			}
			turn++;
		}

		for (int i = 0; i < grid.length; i++) {
			for (int j = 0; j < grid[i].length; j++) {
				if (grid[i][j] == 1) {
					System.out.print("o");
				} else if (grid[i][j] == -1) {
					System.out.print("x");
				} else {
					System.out.print(".");
				}
			}
			System.out.println();
		}

	}
}