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

Submitted solutions:

code_snippet: #include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <bitset>
#include <map>
#include <tuple>
#include <unordered_set>
#include <unordered_map>
#include <list>
#include <numeric>
#include <utility>
#include <iterator>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <ctime>
#include <cassert>
#include <random>
#include <cstring>

#define rep(i,n) for(int i=0;i<int(n);i++)
#define all(x) (x).begin(),x.end()
#define pb push_back

using namespace std;
using ll = long long;

const ll mod = 1000000007;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int ddx[8]={-1,-1,0,1,1,1,0,-1};
int ddy[8]={0,1,1,1,0,-1,-1,-1};
bool debug=false;

/*---------------------------------------------------*/

#define CHOCO 'o'
#define CHEESE 'x'
#define NONE '.'

using Board = vector<vector<char>>;

struct Vector2 {
  int x;
  int y;
};

void debug_print(Board& board){
  for(int i = 0 ; i < 8; i++){
    for(int j = 0; j < 8; j++){
      cout << board[i][j]; 
    }
    cout << endl;
  }
  cout << endl;
}

bool in_area(Vector2 v){
  return 0 <= v.x && v.x < 8 && 0 <= v.y && v.y < 8;
}

bool is_reverse(Board board, Vector2 v, int x, int y, char color){
  v.x += x; v.y += y;
  char check = (color == CHOCO ? CHEESE : CHOCO);
  bool ok = false;
  while(in_area(v)){
    if(board[v.y][v.x] == check) ok = true;
    else if(board[v.y][v.x] == color && ok) return true;
    else break;
    v.x += x; v.y += y;
  }
  return false;
}

int reverse_count(Board board, Vector2 v, char color){
  int reverse_num = 0;
  board[v.y][v.x] = color;
  for(int i = 0; i < 8; i++){
    if(is_reverse(board, v, ddx[i], ddy[i], color)) {
      Vector2 vv = v;
      vv.x += ddx[i], vv.y += ddy[i];
      while(board[vv.y][vv.x] != color) {
	board[vv.y][vv.x] = color;
	reverse_num++;
	vv.x += ddx[i], vv.y += ddy[i];
      }
    }
  }
  return reverse_num;
}

void reverse(Board& board, Vector2 v, char color){
  int reverse_num = 0;
  board[v.y][v.x] = color;
  for(int i = 0; i < 8; i++){
    if(is_reverse(board, v, ddx[i], ddy[i], color)) {
      Vector2 vv = v;
      vv.x += ddx[i], vv.y += ddy[i];
      while(board[vv.y][vv.x] != color) {
	board[vv.y][vv.x] = color;
	reverse_num++;
	vv.x += ddx[i], vv.y += ddy[i];
      }
    }
  }
}

void simulate(Board& board, char& color){
  int max_reverse = 0;
  Vector2 position;
  if(color == CHOCO){
    for(int h = 0; h < 8; h++){
      for(int w = 0; w < 8; w++) {
	if(board[h][w] != NONE) continue;
	int rev = reverse_count(board, {w, h}, color);
	if(max_reverse < rev) {
	  max_reverse = rev;
	  position = {w, h};
	}
      }
    }
  } else {
    for(int h = 7; h >= 0; h--){
      for(int w = 7; w >= 0; w--) {
	if(board[h][w] != NONE) continue;
	int rev = reverse_count(board, {w, h}, color);
	if(max_reverse < rev) {
	  max_reverse = rev;
	  position = {w, h};
	}
      }
    }
  }
  if(max_reverse == 0) return ;
  reverse(board, position, color);
}

int main(){
  vector<vector<char>> board = vector<vector<char>>(8, vector<char>(9));
  for(int i = 0; i < 8; i++){
    for(int j = 0; j < 8; j++){
      cin >> board[i][j];
    }
  }
  
  for(int turn = 0; turn < 64 *  2; turn++){
    char color = (turn % 2 == 0 ? CHOCO : CHEESE);
    simulate(board, color);
    // debug_print(board);
  }
  
  for(int i = 0 ; i < 8; i++){
    for(int j = 0; j < 8; j++){
      cout << board[i][j]; 
    }
    cout << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3172
final_rank: 2

code_snippet: #include "bits/stdc++.h"

#define REP(i,n) for(ll i=0;i<n;++i)
#define RREP(i,n) for(ll i=n-1;i>=0;--i)
#define FOR(i,m,n) for(ll i=m;i<n;++i)
#define RFOR(i,m,n) for(ll i=n-1;i>=m;--i)
#define ALL(v) (v).begin(),(v).end()
#define PB(a) push_back(a)
#define UNIQUE(v) v.erase(unique(ALL(v)),v.end());
#define DUMP(v) REP(i, (v).size()) { cout << v[i]; if (i != v.size() - 1)cout << " "; else cout << endl; }
#define INF 1000000001ll
#define MOD 1000000007ll
#define EPS 1e-9

const int dx[8] = { 1,1,0,-1,-1,-1,0,1 };
const int dy[8] = { 0,1,1,1,0,-1,-1,-1 };


using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll max(ll a, int b) { return max(a, ll(b)); }
ll max(int a, ll b) { return max(ll(a), b); }
ll min(ll a, int b) { return min(a, ll(b)); }
ll min(int a, ll b) { return min(ll(a), b); }
///(?´????????`)(?´????????`)(?´????????`)(?´????????`)(?´????????`)(?´????????`)///
int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	vector<string> v(8);
	REP(i, 8)cin >> v[i];
	
	
	REP(t, 10000) {
		int p = -1, q = -1, cmax = -1;
		if (t % 2 == 0) {
			vi m;
			REP(i, 8) {
				REP(j, 8) {
					if (v[i][j] == '.') {
						int c = 0;
						vi s;
						REP(k, 8) {
							int ni = i, nj = j;
							int tmp = 0;

							REP(l, INF) {
								ni += dx[k], nj += dy[k];
								if (ni < 0 || nj < 0 || ni >= 8 || nj >= 8)break;
								if (v[ni][nj] == 'x')tmp++;
								else if (v[ni][nj] == 'o') {
									if (tmp != 0)s.push_back(k);
									c += tmp;
									break;
								}
								else break;

							}
						}
						if (cmax < c) {
							cmax = c, p = i, q = j;
							m = s;
						}
					}
				}
			}
			if (cmax <= 0)continue;
			else {

				v[p][q] = 'o';
				REP(j, m.size()) {
					int ni = p, nj = q;
					REP(i, INF) {
						ni += dx[m[j]], nj += dy[m[j]];
						if (ni >= 0 && nj >= 0 && ni < 8 && nj < 8 && v[ni][nj] == 'x')v[ni][nj] = 'o';
						else break;
					}
				}


			}
		}

		else {
			vi m;
			REP(i, 8) {
				REP(j, 8) {
					if (v[i][j] == '.') {
						int c = 0;
						vi s;
						REP(k, 8) {
							int ni = i, nj = j;
							int tmp = 0;

							REP(l, INF) {
								ni += dx[k], nj += dy[k];
								if (ni < 0 || nj < 0 || ni >= 8 || nj >= 8)break;
								if (v[ni][nj] == 'o')tmp++;
								else if (v[ni][nj] == 'x') {
									if (tmp != 0)s.push_back(k);
									c += tmp;
									break;
								}
								else break;
							}
						}
						if (cmax <= c) {
							cmax = c, p = i, q = j;
							m = s;
						}
					}
				}
			}
			if (cmax <= 0)continue;
			else {

				v[p][q] = 'x';
				REP(j, m.size()) {
					int ni = p, nj = q;
					REP(i, INF) {
						ni += dx[m[j]], nj += dy[m[j]];
						if (ni >= 0 && nj >= 0 && ni < 8 && nj < 8 && v[ni][nj] == 'o')v[ni][nj] = 'x';
						else break;
					}
				}


			}
		}
	}
	REP(i, 8) {
		REP(j, 8) {
			cout << v[i][j];
		}
		cout << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 3232
final_rank: 3

code_snippet: #include<iostream>
using namespace std;

#define MAX_N 12
#define MAX_T 10000

int x[MAX_N][MAX_N];
int z[8],y[8];
char c,T[4]=".ox";

int main(){
	for(int i=1;i<=8;i++){
		for(int j=1;j<=8;j++){
			cin>>c;
			if(c=='o'){
				x[i][j]=1;
			}
			if(c=='x'){
				x[i][j]=2;
			}
			if(c=='.'){
				x[i][j]=0;
			}
		}
	}
	for(int i=0;i<MAX_T;i++){
		int dx[8]={0,1,1,1,0,-1,-1,-1};
		int dy[8]={-1,-1,0,1,1,1,0,-1};
		for(int h=2;h>0;h--){
			int score=0,maxn=0,cnt=0,X=0,Y=0,cx=0,cy=0;
			for(int j=1;j<=8;j++){
				for(int k=1;k<=8;k++){
					if(x[j][k]==0){
						score=0;
						for(int l=0;l<8;l++){
							z[l]=0;
							cnt=0;
							cx=j+dx[l];cy=k+dy[l];
							while(cx>=1 && cx<=8 && cy>=1 && cy<=8){
								if(x[cx][cy]==0){
									goto E;
								}
								if(x[cx][cy]!=h){
									goto F;
								}
								cnt++;
								cx+=dx[l];cy+=dy[l];
							}
							goto E;
F:;
							score+=cnt;
							z[l]=1;
E:;
						}
						if(score>maxn || (score==maxn && h==1)){
							maxn=score;X=j;Y=k;
							for(int l=0;l<8;l++){y[l]=z[l];}
						}
					}
				}
			}
			if(maxn>=1){
				x[X][Y]=(3-h);
				for(int l=0;l<8;l++){
					if(y[l]==1){
						cx=X+dx[l];cy=Y+dy[l];
						while(cx>=1 && cx<=8 && cy>=1 && cy<=8){
							if(x[cx][cy]!=h){
								break;
							}
							x[cx][cy]=(3-h);
							cx+=dx[l];cy+=dy[l];
						}
					}
				}
			}
		}
	}
	for(int i=1;i<=8;i++){
		for(int j=1;j<=8;j++){
			cout<<T[x[i][j]];
		}
		cout<<endl;
	}
	return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 1136
final_rank: 1