This is an old revision of the document!
Tema 2 – Simulare Fermă (C++)
Publicare: 02.11.2024
Deadline: 16.11.2024, ora 23:59
Autor: Trifu Marius-Constantin
Tema trebuie realizată exclusiv în C++.
Nu se permite folosirea STL (implementați structuri și algoritmi de la zero).
Testare automată pe 18 seturi input/output.
Toate valorile numerice din fișiere trebuie să fie în format standard (punct pentru zecimale).
Se acceptă implementare procedurală sau OOP (dar organizată pe fișiere `.h/.cpp`).
1. Descriere
Simulați gestionarea unei ferme pe mai multe zile. Scopul este să maximizați suma finală de bani prin plantarea și vânzarea legumelor, respectând reguli de rotație a culturilor și constrângeri de bani.
Reguli importante:
Exemplu: Dacă în pătratul 00×00 ai plantat morcov la ziua 1 și l-ai cules la ziua 4, nu poți planta din nou morcov în același pătrat imediat după.
Aceste relații vor fi menționate în secțiunea ROTATIE a fișierului de intrare.
Sumă finală maximă: Obiectivul este să obțineți cea mai mare sumă finală de bani posibilă în perioada de simulare.
Gestionează banii: Ai o sumă inițială și fiecare plantare costă bani. Nu poți planta dacă nu ai bani suficienți.
Cerințe:
Planificați acțiunile de plantare și culegere pentru fiecare zi.
Afișați toate acțiunile în ordine cronologică în fișierul de ieșire.
La sfârșitul simulării, calculați suma finală de bani obținută.
2.1 Fișier de intrare: ferma.txt
Format general:
| ferma.txt |
L L ZILE BANI N
nume_leguma1 timp_cultivare1 cost1 pret_vanzare1
nume_leguma2 timp_cultivare2 cost2 pret_vanzare2
...
ROTATIE M
leguma1 N/A
leguma2 leguma1
leguma3 leguma2
leguma4 leguma1
...
|
Explicații câmpuri:
L – dimensiunea fermei (L × L pătrate), 1 ≤ L ≤ 99
ZILE – numărul de zile de simulare, 1 ≤ ZILE ≤ 100
BANI – suma inițială de bani (RON), 1 ≤ BANI ≤ 10000
N – numărul de legume definite, 1 ≤ N ≤ 20
nume_leguma – numele legumei (maxim 30 caractere, fără spații)
timp_cultivare – numărul de zile necesare pentru cultivare, 1 ≤ timp_cultivare ≤ 30
cost – costul de plantare a unei legume (RON), 1 ≤ cost ≤ 1000
pret_vanzare – prețul de vânzare pentru o legumă (RON), 1 ≤ pret_vanzare ≤ 5000
ROTATIE M – secțiunea ce definește relațiile de rotație între legume
M – numărul de linii de rotație, M ≥ N
leguma1 leguma2 – leguma1 poate fi plantată după leguma2
leguma1 N/A – leguma1 nu are restricții de rotație (poate fi plantată după orice legumă)
Pot exista mai multe linii pentru aceeași legumă (leguma1 poate fi plantată după leguma2, leguma3, etc.)
Restricții:
Numărul total de tipuri de legume: 1 ≤ N ≤ 20
Fiecare legumă apare cel mult o dată în lista de legume
Numărul de linii de rotație: M ≥ N (pot fi mai multe reguli pentru aceeași legumă)
| ferma.txt |
3 3 10 500 4
morcov 3 50 200
ceapa 2 30 150
castravete 4 80 300
roșie 5 100 400
ROTATIE 4
morcov ceapa
ceapa N/A
castravete N/A
roșie morcov
|
Interpretare exemplu:
Fermă 3×3 (9 pătrate disponibile, coordonate de la 00×00 până la 02×02)
Simulare 10 zile
500 RON inițiali
4 tipuri de legume: morcov (3 zile, cost 50, preț 200), ceapă (2 zile, cost 30, preț 150), etc.
Rotație: morcov poate fi plantat după ceapă; ceapa/castravete poate fi plantat după orice (N/A); roșie poate fi plantat după morcov
2.2 Fișier de ieșire: ferma.out
Format general:
| ferma.out |
ZI ACTIUNE PATRAT LEGUMA
ZI ACTIUNE PATRAT LEGUMA
...
SUMA_FINALA: suma
|
Tipuri de acțiuni:
Format linie acțiune:
`ZI ACTIUNE PATRAT [LEGUMA]`
ZI – ziua în care se face acțiunea (1 ≤ ZI ≤ ZILE)
ACTIUNE – `planteaza` sau `culege`
PATRAT – ID-ul pătratului sub formă de coordonată `linia_coloana` (ex: `00×00`, `01×02`)
LEGUMA – numele legumei (doar pentru acțiunea `planteaza`)
Reguli de numerotare pătrate:
Pătratele sunt identificate prin coordonate matrice (linie, coloană)
Coordonatele sunt de la 0 la L-1 pentru linie și coloană
Format: `liniaxcoloana` cu două cifre fiecare (ex: `00×00`, `00×01`, …, `01×00`, `01×01`, …, `99×99`)
Exemplu pentru fermă 3×3:
Linia 0: `00×00`, `00×01`, `00×02`
Linia 1: `01×00`, `01×01`, `01×02`
Linia 2: `02×00`, `02×01`, `02×02`
| ferma.out |
1 planteaza 00x00 ceapa
1 planteaza 00x01 ceapa
1 planteaza 00x02 morcov
3 culege 00x00
3 culege 00x01
4 culege 00x02
4 planteaza 00x00 morcov
4 planteaza 00x01 morcov
7 culege 00x00
7 culege 00x01
SUMA_FINALA: 1190
|
Explicație exemplu:
Zi 1: Plantăm 2 cepe (pătrate 00×00, 00×01) și 1 morcov (pătrat 00×02)
Zi 3: Culegem cele 2 cepe (mature după 2 zile)
Zi 4: Culegem morcovul (matur după 3 zile) și replantăm morcovi în pătratele 00×00 și 00×01
Zi 7: Culegem morcovi din pătratele 00×00 și 00×01
Suma finală: 500 (inițial) + (2×150 + 3×200) - (2×30 + 3×50) = 500 + 900 - 210 = 1190 RON
Observații:
Acțiunile trebuie să fie valide: nu poți planta dacă nu ai bani sau dacă pătratul este ocupat.
Nu poți culege o legumă care nu este matură sau care nu există.
Verificați regulile de validare pentru detalii despre rotație.
3. Reguli de validare
Constrângeri obligatorii:
1. **Rotație culturi identice:**
Dacă culegi leguma X din pătratul P la ziua Z, **NU** poți planta X în P în zilele Z, Z+1, ..., Z+2 (trebuie să aștepți minim 3 zile sau să plantezi altă legumă).
2. **Rotație legume prietenoase:**
Dacă leguma A poate fi plantată după leguma B (din secțiunea ROTATIE cu B diferit de N/A), înseamnă că:
* În pătratul unde tocmai ai cules B, poți planta A a doua zi (după ce s-a trecut cel puțin o zi de la culegere).
* Dacă leguma A are N/A în ROTATIE, poate fi plantată după orice legumă a doua zi (exceptând regulile de culturi identice).
3. **Disponibilitate pătrat:**
Un pătrat este liber dacă:
* Nu a fost niciodată plantat
* Sau s-a cules leguma din el și s-a trecut cel puțin o zi și se respectă regulile de rotație
4. **Bani:**
La orice moment, banii disponibili = banii inițiali + venituri din vânzări - costuri plantare
Suma finală de bani = banii inițiali + venituri din vânzări - costuri plantare
5. **Maturitate:**
O legumă poate fi culeasă doar dacă au trecut **cel puțin** `timp_cultivare` zile de la plantare
Priorități:
Maximizați suma finală de bani
Utilizați eficient toate pătratele disponibile
Respectați toate constrângerile de mai sus
4. Implementare
În main.cpp trebuie să existe doar `int main`, unde apelați funcții.
Evitați declararea variabilelor direct în `main`.
Toate funcțiile trebuie documentate cu un scurt comentariu.
Folosiți `<fstream>` și verificați deschiderea fișierelor.
Separator zecimal: punct (`.`).
Gestionați starea fermei (ce este plantat în fiecare pătrat, când a fost plantat, etc.).
5. Punctaj (10p)
Notă: Dacă tema nu compilează sau nu trece niciun test, va fi notată cu 0 puncte.
6. Încărcare
Link de încărcare: aici
După accept:
7. Exemple suplimentare
Exemplu complex:
| ferma.txt |
2 2 10 300 2
morcov 3 50 200
ceapa 2 40 160
ROTATIE 2
morcov ceapa
ceapa N/A
|
Strategie posibilă:
| ferma.out |
1 planteaza 00x00 ceapa
1 planteaza 00x01 ceapa
3 culege 00x00
3 culege 00x01
4 planteaza 00x00 morcov
4 planteaza 00x01 morcov
6 culege 00x00
6 culege 00x01
7 planteaza 00x00 ceapa
7 planteaza 00x01 morcov
9 culege 00x00
10 culege 00x01
SUMA_FINALA: 1110
|
Calcul sumă finală:
Cheltuieli: 2×40 (cepe zi 1) + 2×50 (morcovi zi 4) + 1×40 (ceapă zi 7) + 1×50 (morcov zi 7) = 80 + 100 + 40 + 50 = 270 RON
Venituri: 2×160 (cepe zi 3) + 2×200 (morcovi zi 6) + 1×160 (ceapă zi 9) + 1×200 (morcov zi 10) = 320 + 400 + 160 + 200 = 1080 RON
Suma finală: 300 (inițial) + 1080 - 270 = 1110 RON