#include "Azzurro.h"
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) {
std::vector<std::vector<int>> x(N, std::vector<int>(N, 0));
bool bits[51];
for(int i=0; i<L; i++){
bits[i] = S[i]-'A';
}
for(int i=L; i<51; i++)bits[i] = 0;
int index = 0;
x[0][0] = bits[index++];
for(int i=1; i<N; i++){
for(int j=0; j<N-1; j++){
x[i][j] = bits[index++];
}
}
x[N-1][N-1] = bits[index++];
for(int diag=1; diag<N*2-2; diag++){
int i = diag, j = 0;
if(diag > 7){
j = diag-7;
i = N-1;
}
int si = i, sj = j;
int X = 0;
while(i >= 0 && j < N){
X ^= x[j][i];
i -= 2;
j += 2;
}
x[sj][si] = X;
}
return x;
}
#include "Bordeaux.h"
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(const int N, const int L, std::vector<std::vector<int>> T) {
const int nbDiag = N*2-2;
bool passed[nbDiag];
passed[0] = true;
for(int diag=1; diag<nbDiag; diag++){
int i = diag, j = 0;
if(diag > 7){
j = diag-7;
i = N-1;
}
int si = i, sj = j;
int X = 0;
while(i >= 0 && j < N){
X ^= T[j][i];
i -= 2;
j += 2;
}
passed[diag] = X;
}
int x=0, y=0;
T[0][0] ^= 1;
T[N-1][N-1] ^= 1;
int dists[nbDiag];
dists[0] = 0;
for(int diag=1; diag<nbDiag; diag++){
dists[diag] = dists[diag-1];
if(passed[diag] != passed[diag-1]){
if(diag <= 7)
dists[diag]++;
else
dists[diag]--;
}
}
for(int diag=1; diag<nbDiag; diag++){
int i = diag, j = 0;
if(diag > 7){
j = diag-7;
i = N-1;
}
T[j+dists[diag]][i-dists[diag]] ^= 1;
}
bool bits[51];
int index = 0;
bits[index++] = T[0][0];
for(int i=1; i<N; i++){
for(int j=0; j<N-1; j++){
bits[index++] = T[i][j];
}
}
std::string S(L, 'A');
bits[index++] = T[N-1][N-1];
for(int i=0; i<L; i++){
S[i] = 'A'+bits[i];
}
return S;
}