#include<iostream>
#include<string>
#include<cstdlib>
#include<cmath>
using namespace std;
struct Ind_data;
class eAP;
class eAI;
eAP* AP;
eAI* AI;
struct Ind_data
{
std::string move;
std::string proc;
int hod = 0;
int total = 0;
int lsbank = 24;
int nbank[9]{};
};
class base
{
public:
int** field = new int* [21];
int* ysa = new int[25];
int* xsa = new int[25];
int* lis = new int[25];
void Mat()
{
for (int i = 0; i < 21; i++)
{
field[i] = new int[21];
}
}
void Freemat()
{
for (int i = 0; i < 21; i++)
{
delete[] field[i];
}
delete[] field;
}
void WMLS()
{
int x, y, xw, yw, i = 0;
int* xs = new int[1000];
int* xe = new int[1000];
int* ys = new int[1000];
int* ye = new int[1000];
string* ipd = new string[60];
bool m = true;
bool w = true;
int a = 24;
int br = 0;
for (x = 0; x <= 20; x++)
{
for (y = 0; y <= 20; y++)
{
if (x % 2 == 0 || (x % 2 != 0 && y % 2 == 0))
{
field[x][y] = 0;
}
else
{
field[x][y] = 2;
}
}
}
while (m == true)
{
i++;
ipd[i] = "";
cin >> ipd[i];
if (ipd[i].length() == 4)
{
int n = stoi(ipd[i]);
int start = n / 100;
int end = n % 100;
xs[i] = start % 10;
ys[i] = start / 10;
xe[i] = end % 10;
ye[i] = end / 10;
for (x = 0; x <= 20; x++)
{
for (y = 0; y <= 20; y++)
{
if (x >= (xs[i] * 2 + 1) && (x <= (xe[i] * 2 + 1)) && (y >= (ys[i] * 2 + 1) && (y <= (ye[i] * 2 + 1)) && (field[x][y] == 2)))
{
field[x][y] = 3;
}
}
}
}
else
{
m = false;
}
}
while (w == true)
{
if (ipd[i][2] != 'E' && (ipd[i][2] != 'W') && (ipd[i][2] != 'S') && (ipd[i][2] != 'N'))
{
w = false;
}
else
{
yw = ((int)ipd[i][0]) - 48;
xw = ((int)ipd[i][1]) - 48;
y = yw * 2 + 1;
x = xw * 2 + 1;
switch (ipd[i][2])
{
case ('E'):
{
field[x + 1][y] = 1;
}
break;
case ('W'):
{
field[x - 1][y] = 1;
}
break;
case ('S'):
{
field[x][y - 1] = 1;
}
break;
case ('N'):
{
field[x][y + 1] = 1;
}
break;
}
i++;
cin >> ipd[i];
}
}
br = i;
string* ls = new string[25];
for (i = 1; i < 25; i++)
{
if (i == 1)
{
ls[i] = ipd[br];
}
else
{
cin >> ls[i];
}
ysa[i] = (((int)ls[i][0]) - 48) * 2 + 1;
lis[i] = (((int)ls[i][2]) - 48) * 2 + 1;
xsa[i] = (((int)ls[i][1]) - 48) * 2 + 1;
}
field[1][1] = 4;
field[1][19] = 4;
field[19][1] = 4;
field[19][19] = 4;
}
};
class eAP
{
public:
int x = 1, y = 1, score = 0, j = 0;
int* inv = new int[4];
int sb = 150, mb = 30, jb = 60, rb = 75, lb = 75, bb = 30;
int rot = 90;
void Freeinv()
{
delete[] inv;
}
void iniinv()
{
for (int i = 1; i < 4; i++)
{
inv[i] = 0;
}
}
void MOVE(Ind_data data, base origin, eAI& AI);
void Freeinvga(Ind_data data)
{
cout << "!!--!!" << endl;
int i = 1, count = 0, l = 1;
for (i; i <= j - 1; i++)
{
for (l; l < 9; l++)
{
if (inv[i] == data.nbank[l])
count++;
}
if (count == 0)
{
score = score + 2;
data.nbank[inv[i]] = inv[i];
}
else
{
score++;
}
count = 0;
}
j = 1;
for (i = 1; i < 4; i++)
{
inv[i] = 0;
}
}
void finalpose()
{
cout << "Final position is(for x) " << (x - 1) / 2 << endl;
cout << "Final position is(for y) " << (y - 1) / 2 << endl;
cout << "Score " << score << endl;
cout << "samples on the board " << j - 1 << endl;
}
};
void printline()
{
cout << "------------------------------------------------------------------------------------------------------------" << endl;
}
class eAI
{
public:
int x, y, score = 0, j = 1;
int* inv = new int[4];
int sb = 150, mb = 30, jb = 60, rb = 75, lb = 75, bb = 30;
int rot = 90;
void iniinv()
{
for (int i = 1; i < 4; i++)
{
inv[i] = 0;
}
}
void Freeinv()
{
delete[] inv;
}
void MOVE(Ind_data data, base origin, eAP AP)
{
int k, i = 0;
int d = 0;
bool multi = true;
cout << "round" << data.hod << endl;
data.proc = "";
if (data.hod != 0)
{
cin >> data.move;
}
k = data.move.length();
if (data.move.length() + data.total > 420)
{
k = (data.move.length() + data.total) - 420;
}
for (int i = 0; i < k; i++)
{
switch (data.move[i])
{
case 'S':
{
if (sb > 0)
{
data.proc = data.proc + data.move[i];
sb--;
}
}
break;
case 'J':
{
if (jb > 0)
{
data.proc = data.proc + data.move[i];
jb--;
}
}
break;
case 'M':
{
if (mb > 0)
{
data.proc = data.proc + data.move[i];
mb--;
}
}
break;
case 'B':
{
if (bb > 0)
{
data.proc = data.proc + data.move[i];
bb--;
cout << rot <<"!" << endl;
}
}
break;
case 'R':
{
if (rb > 0)
{
data.proc = data.proc + data.move[i];
rb--;
}
}
break;
case 'L':
{
if (lb > 0)
{
data.proc = data.proc + data.move[i];
lb--;
}
}
break;
}
}
for (int r = 0; r < data.proc.length(); r++)
{
multi = true;
switch (data.proc[r])
{
case 'S':
{
switch (rot)
{
case 90:
{
if (origin.field[x][y + 1] != 1 && (origin.field[x][y] == origin.field[x][y + 2] || origin.field[x][y] == 4 || origin.field[x][y + 2] == 4) && ((y + 2) < 20) && ((y + 2) != AP.y || x != AP.x))
{
y = y + 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 60;
origin.ysa[i] = i + 60;
cout << "Found sample" << endl;
}
}
cout << y << "!!!" << endl;
}
}
break;
case 180:
{
if (origin.field[x - 1][y] != 1 && (origin.field[x][y] == origin.field[x - 2][y + 2] || origin.field[x][y] == 4 || origin.field[x - 2][y] == 4) && ((x - 2) > 0) && (x - 2) != AP.x || y != AP.y)
x = x - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 60;
origin.ysa[i] = i + 60;
}
}
}
break;
case 270:
{
if (origin.field[x][y - 1] != 1 && (origin.field[x][y] == origin.field[x][y - 2] || origin.field[x][y] == 4 || origin.field[x][y - 2] == 4) && ((y - 2) > 0) && (y - 2) != AP.y || x != AP.x)
y = y - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
}
}
}
break;
case 0:
{
if (origin.field[x + 1][y] != 1 && (origin.field[x][y] == origin.field[x + 2][y] || origin.field[x][y] == 4 || origin.field[x + 2][y] == 4) && ((x + 2) < 20) && (x + 2) != AP.x || y != AP.y)
x = x + 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
}
}
}
break;
}
if (origin.field[x][y] == 4 && j > 1)
{
Freeinvga(data);
}
}
break;
case 'J':
{
switch (rot)
{
case 90:
{
if (y + 2 < 20)
y = y + 2;
for (i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
}
}
}
break;
case 180:
{
if (x - 2 >= 1)
x = x - 2;
for (i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
}
}
}
break;
case 270:
{
if (y - 2 >= 1)
y = y - 2;
for (i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
}
}
}
break;
case 0:
{
if (x + 2 <= 19)
x = x + 2;
for (i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
}
}
}
}
break;
if (origin.field[x][y] == 4 && j > 1)
{
Freeinvga(data);
}
}
case 'M':
{
while (multi)
{
switch (rot)
{
case 90:
{
if (origin.field[x][y + 1] != 1 && (origin.field[x][y] == origin.field[x][y + 2] || origin.field[x][y] == 4 || origin.field[x][y + 2] == 4) && ((y + 2) < 20) && ((y + 2) != AP.y || x != AP.x))
{
y = y + 2;
for (i = 1; i <= 24; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
cout << "Found sample" << endl;
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
multi = false;
}
}
}
else
{
multi = false;
}
}
break;
case 180:
{
if (origin.field[x - 1][y] != 1 && (origin.field[x][y] == origin.field[x - 2][y + 2] || origin.field[x][y] == 4 || origin.field[x - 2][y] == 4) && ((x - 2) > 0) && ((x - 2) != AP.x || y != AP.y))
{
x = x - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
multi = false;
}
}
}
else
{
multi = false;
}
}
break;
case 270:
{
if (origin.field[x][y - 1] != 1 && (origin.field[x][y] == origin.field[x][y - 2] || origin.field[x][y] == 4 || origin.field[x][y - 2] == 4) && ((y - 2) > 0) && ((y - 2) != AP.y || x != AP.x))
{
y = y - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
multi = false;
}
}
}
else
multi = false;
}
break;
case 0:
{
if (origin.field[x + 1][y] != 1 && (origin.field[x][y] == origin.field[x + 2][y] || origin.field[x][y] == 4 || origin.field[x + 2][y] == 4) && ((x + 2) < 20) && ((x + 2) != AP.x || y != AP.y))
{
x = x - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
multi = false;
}
}
}
else
{
multi = false;
}
}
break;
}
}
cout << origin.field[x][y]<<"---1---"<< endl;
if (origin.field[x][y] == 4 && j > 1)
{
Freeinvga(data);
}
}
break;
case 'B':
{
rot = rot - 180;
if (rot == -90)
{
rot = 270;
}
if (rot == -180)
{
rot = abs(rot);
}
cout << rot<<"---"<<endl;
}
break;
case 'R':
{
rot = rot - 90;
if (rot == -90)
rot = 270;
}
break;
case 'L':
{
rot = rot + 90;
if (rot == 360)
rot = 0;
}
break;
}
}
}
void Freeinvga(Ind_data data)
{
cout << "!!--!!" << endl;
int i = 1,count = 0,l = 1;
for (i; i <= j - 1; i++)
{
for (l; l < 9; l++)
{
if (inv[i] == data.nbank[l])
count++;
}
if(count == 0)
{
score = score + 2;
data.nbank[inv[i]] = inv[i];
}
else
{score++;}
count = 0;
}
j = 1;
for (i = 1; i < 4; i++)
{
inv[i] = 0;
}
}
void finalpose()
{
cout << "Final position is(for x) " << (x- 1)/ 2 << endl;
cout << "Final position is(for y) " << (y - 1) / 2 << endl;
cout << "Score " << score << endl;
cout << "samples on the board " << j - 1 << endl;
}
};
void eAP::MOVE(Ind_data data, base origin, eAI& AI)
{
int k, i = 0;
int d = 0;
bool multi = true;
cout << "round" << data.hod << endl;
data.proc = "";
if (data.hod != 0)
{
cin >> data.move;
}
k = data.move.length();
if (data.move.length() + data.total > 420)
{
k = (data.move.length() + data.total) - 420;
}
for (int i = 0; i < k; i++)
{
switch (data.move[i])
{
case 'S':
{
if (sb > 0)
{
data.proc = data.proc + data.move[i];
sb--;
}
}
break;
case 'J':
{
if (jb > 0)
{
data.proc = data.proc + data.move[i];
jb--;
}
}
break;
case 'M':
{
if (mb > 0)
{
data.proc = data.proc + data.move[i];
mb--;
}
}
break;
case 'B':
{
if (bb > 0)
{
data.proc = data.proc + data.move[i];
bb--;
}
}
break;
case 'R':
{
if (rb > 0)
{
data.proc = data.proc + data.move[i];
rb--;
}
}
break;
case 'L':
{
if (lb > 0)
{
data.proc = data.proc + data.move[i];
lb--;
}
}
break;
}
}
for (int r = 0; r < data.proc.length(); r++)
{
multi = true;
switch (data.proc[r])
{
case 'S':
{
switch (rot)
{
case 90:
{
if (origin.field[x][y + 1] != 1 && (origin.field[x][y] == origin.field[x][y + 2] || origin.field[x][y] == 4 || origin.field[x][y + 2] == 4) && ((y + 2) < 20) && ((y + 2) != AI.y || x != AI.x))
{
y = y + 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 60;
origin.ysa[i] = i + 60;
cout << "Found sample" << endl;
}
}
}
}
break;
case 180:
{
if (origin.field[x - 1][y] != 1 && (origin.field[x][y] == origin.field[x - 2][y + 2] || origin.field[x][y] == 4 || origin.field[x - 2][y] == 4) && ((x - 2) > 0) && (x - 2) != AI.x || y != AI.y)
x = x - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 60;
origin.ysa[i] = i + 60;
cout << "Found sample" << endl;
}
}
}
break;
case 270:
{
if (origin.field[x][y - 1] != 1 && (origin.field[x][y] == origin.field[x][y - 2] || origin.field[x][y] == 4 || origin.field[x][y - 2] == 4) && ((y - 2) > 0) && (y - 2) != AI.y || x != AI.x)
y = y - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
}
}
}
break;
case 0:
{
if (origin.field[x + 1][y] != 1 && (origin.field[x][y] == origin.field[x + 2][y] || origin.field[x][y] == 4 || origin.field[x + 2][y] == 4) && ((x + 2) < 20) && (x + 2) != AI.x || y != AI.y)
x = x + 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
}
}
}
break;
}
if (origin.field[x][y] == 4 && j > 1)
{
Freeinvga(data);
}
}
break;
case 'J':
{
switch (rot)
{
case 90:
{
if (y + 2 < 20)
y = y + 2;
for (i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
}
}
}
break;
case 180:
{
if (x - 2 >= 1)
x = x - 2;
for (i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
}
}
}
break;
case 270:
{
if (y - 2 >= 1)
y = y - 2;
for (i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
}
}
}
break;
case 0:
{
if (x + 2 <= 19)
x = x + 2;
for (i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
}
}
}
}
break;
if (origin.field[x][y] == 4 && j > 1)
{
Freeinvga(data);
}
}
case 'M':
{
while (multi)
{
switch (rot)
{
case 90:
{
if (origin.field[x][y + 1] != 1 && (origin.field[x][y] == origin.field[x][y + 2] || origin.field[x][y] == 4 || origin.field[x][y + 2] == 4) && ((y + 2) < 20) && ((y + 2) != AI.y || x != AI.x))
{
y = y + 2;
for (i = 1; i <= 24; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
cout << "Found sample" << endl;
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
multi = false;
}
}
}
else
{
multi = false;
}
}
break;
case 180:
{
if (origin.field[x - 1][y] != 1 && (origin.field[x][y] == origin.field[x - 2][y + 2] || origin.field[x][y] == 4 || origin.field[x - 2][y] == 4) && ((x - 2) > 0) && ((x - 2) != AI.x || y != AI.y))
{
x = x - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
multi = false;
}
}
}
else
{
multi = false;
}
}
break;
case 270:
{
if (origin.field[x][y - 1] != 1 && (origin.field[x][y] == origin.field[x][y - 2] || origin.field[x][y] == 4 || origin.field[x][y - 2] == 4) && ((y - 2) > 0) && ((y - 2) != AI.y || x != AI.x))
{
y = y - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
multi = false;
}
}
}
else
multi = false;
}
break;
case 0:
{
if (origin.field[x + 1][y] != 1 && (origin.field[x][y] == origin.field[x + 2][y] || origin.field[x][y] == 4 || origin.field[x + 2][y] == 4) && ((x + 2) < 20) && ((x + 2) != AI.x || y != AI.y))
{
x = x - 2;
for (int i = 1; i < 25; i++)
{
if (x == origin.xsa[i] && y == origin.ysa[i] && j <= 3)
{
inv[j] = origin.lis[i];
j++;
origin.xsa[i] = i + 99;
origin.ysa[i] = i + 99;
cout << "Found sample" << endl;
multi = false;
}
}
}
else
{
multi = false;
}
}
break;
}
}
cout << origin.field[x][y] << "---1---" << endl;
if (origin.field[x][y] == 4 && j > 1)
{
Freeinvga(data);
}
}
break;
case 'B':
{
rot = rot - 180;
if (rot == -90)
{
rot = 270;
}
if (rot == -180)
{
rot = abs(rot);
}
cout << rot << "---" << endl;
}
break;
case 'R':
{
rot = rot - 90;
if (rot == -90)
rot = 270;
}
break;
case 'L':
{
rot = rot + 90;
if (rot == 360)
rot = 0;
}
break;
}
}
}
int main()
{
base origin;
eAI AI;
eAP AP;
Ind_data data;
string st;
int k;
int j = 0;
int i;
bool multi = true;
AI.iniinv();
AP.iniinv();
origin.Mat();
origin.WMLS();
cin >> st;
if (st[0] == '0')
{
AI.x = 1;
AI.y = 1;
AP.x = 19;
AP.y = 1;
cin >> data.move;
data.hod = 0;
}
else
{
AI.x = 1;
AI.y = 19;
AP.x = 1;
AP.y = 1;
data.move = st;
data.hod = 1;
}
cout << data.move;
while ((data.total <= 420) && (data.lsbank > 0))
{
printline();
if (data.hod % 2 == 0)
{
data.hod++;
AI.MOVE(data, origin, AP);
AI.finalpose();
}
else
{
data.hod++;
AP.MOVE(data, origin, AI);
AP.finalpose();
}
}
origin.Freemat();
AI.Freeinv();
return 0;
}