Tabla za RGB šah je kvadratnog oblika i njena polja su crvene, zelene i plave boje. Gornje levo polje je crvene boje, polje desno od njega zelene boje, a polje desno od njega plave boje. Ovaj obrazac ređanja boja se nastavlja ciklično po vrstama. Na primer za \(n = 4\), tabla izgleda ovako:
R G B R G B R G B R G B R G B R
pri čemu su sa R označena crvena, sa G zelena, a sa B plava polja.
Napisati program koji određuje koliko ima crvenih, zelenih i plavih polja na putu od početne do krajnje zadate pozicije, pri čemu se put kreira po redovima: ide se desno do kraja reda, zatim se prelazi na sledeći red, i tako redom. I početna i krajnja pozicija se računaju u zbir.
Sa standardnog ulaza se unosi veličina stranice table \(n\) (\(3 \leq n \leq 10^5\)), a nakon toga i koordinate početnog i krajnjeg polja, \((x_1, y_1)\) i \((x_2, y_2)\) (\(0 \leq x_1, x_2, y_1, y_2 < n\)). Podrazumevati da su koordinate gornjeg levog polja \((0,0)\).
Na standardni izlaz ispisati redom koliko ima crvenih, zelenih i plavih polja na putu od početnog do krajnjeg polja, računajući i njih.
4 1 1 3 2
3 3 4
Putanja od početnog do krajnjeg polja je označena malim slovima
R G B R G b r g b r g b r g b R
U ovom bloku se opisuje glavno rešenje zadatka.
#include <iostream>
using namespace std;
int divisible_in_range(int a, int b, int k)
{
int l = a % k == 0 ? a / k : a / k + 1; // ceil(a/k)
int r = b / k; // floor(b/k)
return r >= l ? r - l + 1 : 0;
}
int main()
{
int n; cin >> n;
int x1, y1, x2, y2;
>> x1 >> y1 >> x2 >> y2;
cin
int start = n * x1 + y1;
int end = n * x2 + y2;
int R = divisible_in_range(start, end, 3);
int G = R;
if (start % 3 == 1) G++; // [G B R ...]
if (end % 3 == 0) G--; // [... G B R]
int B = R;
if (start % 3 >= 1) B++; // [G B R ...] ili [B R ...]
if (end % 3 <= 1) B--; // [... G B R] ili [... G B]
<< R << " " << G << " " << B << endl;
cout
return 0;
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void next(char &x)
{
if (x == 'R') {
= 'G';
x } else if (x == 'G') {
= 'B';
x } else { // x == 'B'
= 'R';
x }
}
void update_count(char x, int &R, int &G, int &B)
{
if (x == 'R') {
++;
R} else if (x == 'G') {
++;
G} else if (x == 'B') {
++;
B}
}
int main()
{
int n; cin >> n;
int x1, y1, x2, y2;
>> x1 >> y1 >> x2 >> y2;
cin
char tmp = 'R';
<string> M(n);
vectorfor (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
[i].push_back(tmp);
M(tmp);
next}
}
int R = 0, G = 0, B = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if ((i == x1 && j >= y1) ||
(x1 < i && i < x2) ||
(i == x2 && j <= y2)) {
(M[i][j], R, G, B);
update_count}
}
}
<< R << " " << G << " " << B << endl;
cout
return 0;
}