#include "Azzurro.h"
#include <iostream>
using namespace std;
namespace {
// グローバル変数と内部関数は無名名前空間内で宣言すること
// All global variables and internal functions should be declared in an unnamed namespace
int variable_example = 0;
int function_example(void) { return 0; }
}
std::vector<std::vector<int>> Azzurro(int N, int L, std::string S) {
//cout<<"A\n";
vector<vector<vector<int>>> v(2 * N);
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
v[i + j].push_back({i, j});
}
}
vector<vector<int>> ans(N, vector<int>(N, 0));
int cur = 0;
for (int i = 0; i < 2 * N; i++){
if (i == 1 || i == 2 * N - 3) continue;
int sz = ((int)v[i].size() + 1) / 2;
for (int j = 0; j < v[i].size(); j++){
if (j % 4 == 2 || (j % 2 == 0 && j >= (int)v[i].size() - 2 && i != 0 && i != 2 * N - 2)){
ans[v[i][j][0]][v[i][j][1]] = ans[v[i][j - 2][0]][v[i][j - 2][1]];
continue;
}
if (cur < L && S[cur] == 'B'){
ans[v[i][j][0]][v[i][j][1]] = 1;
}
cur++;
}
}
return ans;
}
#include "Bordeaux.h"
#include <iostream>
using namespace std;
namespace {
// グローバル変数と内部関数は無名名前空間内で宣言すること
// All global variables and internal functions should be declared in an unnamed namespace
int variable_example = 0;
int function_example(void) { return 0; }
}
std::string Bordeaux(int N, int L, std::vector<std::vector<int>> T) {
//cout<<"B\n";
std::string s(L, 'A');
vector<vector<vector<int>>> v(2 * N);
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
v[i + j].push_back({i, j});
}
}
int cur = 0;
int x = 0, y = -1;
for (int i = 0; i < 2 * N; i++){
if (i == 1 || i == 2 * N - 3){
for (int j = 0; j < v[i].size(); j++){
if (T[v[i][j][0]][v[i][j][1]] == 1) x = v[i][j][0], y = v[i][j][1];
}
continue;
}
int cnt = 0;
for (int j = 0; j < v[i].size(); j++){
int di = abs(v[i][j][0] - x) + abs(v[i][j][1] - y);
if (di == 1) cnt++;
if (di == 1 && j % 2 == 1){
int ind = j - 1;
int di2 = abs(v[i][ind][0] - x) + abs(v[i][ind][1] - y);
//cout<<x<<" "<<y<<" "<<di2<<"\n";
if (di2 != 1){
ind = j + 1;
}
if (ind >= v[i].size()) continue;
di2 = abs(v[i][ind][0] - x) + abs(v[i][ind][1] - y);
//cout<<x<<" "<<y<<" "<<di2<<"\n";
if (di2 != 1) continue;
int fr = ind;
if (fr >= (int)v[i].size() - 2){
fr -= 2;
}
else{
fr ^= 2;
}
//if (ind < 0 || ind >= v[i].size()) cout<<"Aboba\n"<<" "<<v[i].size()<<" "<<i<<" "<<ind<<"\n";
//cout<<"E\n";
if (T[v[i][ind][0]][v[i][ind][1]] == T[v[i][fr][0]][v[i][fr][1]]){
//cout<<"E1\n";
T[v[i][j][0]][v[i][j][1]] ^= 1;
x = v[i][j][0], y = v[i][j][1];
}
else{
//cout<<"E2\n";
T[v[i][ind][0]][v[i][ind][1]] ^= 1;
x = v[i][ind][0], y = v[i][ind][1];
}
//cout<<"F\n";
continue;
}
}
for (int j = 0; j < v[i].size(); j++){
int di = abs(v[i][j][0] - x) + abs(v[i][j][1] - y);
if (cnt == 1 && di == 1){
T[v[i][j][0]][v[i][j][1]] ^= 1;
x = v[i][j][0], y = v[i][j][1];
}
}
for (int j = 0; j < v[i].size(); j++){
if (j % 4 == 2 || (j % 2 == 0 && j >= (int)v[i].size() - 2 && i != 0 && i != 2 * N - 2)){
continue;
}
if (cur < L && T[v[i][j][0]][v[i][j][1]] == 1){
s[cur] = 'B';
}
cur++;
}
if (i == 0 || i == 2 * N - 2){
x = 0, y = 0;
}
}
cout<<s<<"\n";
return s;
}