👤

C++

Robinson are un teren de forma pătrată, ca un tablou bidimensional, cu latura de m unități (cu m2 parcele). O parcelă este un pătrat elementar al tabloului. Liniile și coloanele sunt numerotate de la 1 la m: liniile de sus în jos, iar coloanele de la stânga la dreapta.

El a semănat grâu și s-a rugat să aibă o recoltă bogată. Ruga i-a fost ascultată și grâul a răsărit astfel: în parcelele din prima linie, recoltele au fost de la stânga spre dreapta: n, n+1, n+2, … boabe de grâu și în parcelele de pe prima coloană, recoltele au fost de sus în jos: n, n+1, n+2, … boabe de grâu.

Apoi, dacă parcurgem celelalte parcele linie cu linie începând cu a doua linie, iar în cadrul unei linii, începând cu coloana a doua, atunci recolta din linia i și coloana j a fost egală cu suma recoltelor de pe pozițiile (i-1,j) și (i,j-1).

Dacă aceste sume depășesc 999, atunci ele vor fi înlocuite cu numerele formate din ultimele 3 cifre ale sumei respective (de exemplu, dacă suma=1234, se va reține numărul 234).

Odată cu împlinirea rugii, Robinson a avut un vis în care, pentru a avea noroc și anul viitor, i se cerea ca în prima zi să culeagă grâul astfel: să plece de la o poziție dată (linia l și coloana c), de unde va culege toate boabele de pe acea poziție. Apoi, el va calcula restul împărțirii la 4 a numărului de boabe de pe acea poziție. Poziția următoare pentru cules va fi cea vecină din Nord, dacă restul este 0, cea vecină din Est, dacă restul este 1, cea vecină din Sud, dacă restul este 2, sau cea vecină din Vest, dacă restul este 3.

Drumul acesta pe care l-a visat se va opri fie când la poziția următoare este în afara terenului, fie când poziția următoare este una de pe care s-a cules deja recolta.

Cerință
Scrieți un program care să citească numerele m, n, l și c și care să determine:

a) recoltele de pe fiecare parcelă;
b) succesiunea parcelelor vizitate, în ordinea în care s-a cules grâul în drumul visat;

Date de intrare
De pe prima linie a fișierului de intrare robinson.in se citesc numerele m n l c în această ordine, separate de câte un spațiu; l și c indică o poziție corectă din tablou.

Date de ieșire
Pe prima linie a fișierului de ieșire robinson.out se va afișa valoarea a[m][m]. Următoarele linii vor conține câte două numere naturale separate de un spațiu indicând coordonatele fiecărei parcele din drumul parcurs: primul număr indică linia iar al doilea număr coloana parcelei vizitate.

Restricții
m, n, l, c sunt numere naturale,
1 ≤ m ≤ 20
1 ≤ n ≤ 100
Pentru determinarea corectă a valorii a[m][m] se acordă 30% din punctaj.
Pentru indicarea corectă a drumului parcurs se acordă încă 70% din punctaj.
Exemplu
robinson.in robinson.out Explicații
4 55 1 3
130
1 3
1 4
2 4
2 3
a) m=4, adică tabloul pătrat are latura de 4 unități. n=55, deci prima linie este:
55, 56, 57 și 58. La fel și prima coloană: 55, 56, 57, 58, de sus în jos. Apoi linia
a doua se completează astfel: a[2,2]=a[1,2]+a[2,1]=56+56=112, apoi
a[2,3] = a[1,3]+a[2,2]=57+112=169 ; apoi a[2,4]=a[1,4]+a[2,3] etc. Linia a treia,
se va completa astfel: a[3,2]=a[2,2]+a[3,1]; apoi a[3,3]=a[2,3]+ a[3,2], apoi
a[3,4]= a[2,4]+ a[3,3] etc.

Atentie: a[4,4]=a[3,4]+a[4,3]=565+565=1130 și se reține a[4,4]=130, adică numărul
format din ultimele 3 cifre ale lui 1130.

b) Poziția de plecare: a[1;3]=57, cu rest 1, deci direcția este Est. Aici avem a[1,4]=58,
care are rest 2, deci direcția este Sud. Aici a[2,4]=227, cu rest 3, deci direcția este
Vest, unde avem a[2,3]=169. Acesta are restul 1 și direcția este Est, și ar trebui să se
revină pe poziția (2,4) pe care a mai fost. S-au afișat pozițiile (1;3),(1;4),(2,4) și (2;3).
Dacă în loc de l=1 și c=3 am fi avut l=3 și c=4, atunci a[3,4] = 565, cu rest 1, deci
direcția Est și ar trebui să iasă din teren. Drumul acesta ar avea un pas.





va rog repede


Răspuns :

Răspuns:

#include <iostream>

#include <fstream>

#include <vector>

using namespace std;

const int MAX_M = 20;

int a[MAX_M + 1][MAX_M + 1];

int main() {

ifstream fin("robinson.in");

ofstream fout("robinson.out");

int m, n, l, c;

fin >> m >> n >> l >> c;

// Calculul recoltelor conform regulilor date

for (int i = 1; i <= m; ++i) {

for (int j = 1; j <= m; ++j) {

if (i == 1 && j == 1) {

a[i][j] = n;

} else if (i == 1) {

a[i][j] = (a[i][j - 1] + 1) % 1000;

} else if (j == 1) {

a[i][j] = (a[i - 1][j] + 1) % 1000;

} else {

a[i][j] = (a[i - 1][j] + a[i][j - 1]) % 1000;

}

}

}

// Afișarea recoltei totale

fout << a[m][m] << endl;

// Determinarea drumului parcurs conform visului lui Robinson

vector<pair<int, int>> positions;

int row = l, col = c;

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

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

while (row >= 1 && row <= m && col >= 1 && col <= m) {

positions.push_back({row, col});

int remainder = a[row][col] % 4;

row += dx[remainder];

col += dy[remainder];

}

// Afișarea pozițiilor parcursului

for (const auto& pos : positions) {

fout << pos.first << " " << pos.second << endl;

}

fin.close();

fout.close();

return 0;

}

Explicație:

Sper ca este corect (nu uita sa elimini explicatiile mele suplimentare)