This is an old revision of the document!


Tema 2 – Simulare Fermă (C++)

Publicare: 03.11.2024
Deadline: 17.11.2024, ora 23:59

Autor: Trifu Marius-Constantin

Informații generale

  • Tema trebuie realizată exclusiv în C++.
  • Nu se permite folosirea STL (implementați structuri și algoritmi de la zero).
  • Testare automată pe 8 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:

  • Rotație culturi: În același pătrat nu poți planta două culturi identice una după alta.

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ă.

  • Plante prietenoase: Unele legume pot fi plantate doar după alte legume specifice (legumă după legumă).

Exemplu: Morcovul poate fi plantat doar după ceapă, castravete sau rădăcinoase.

  • 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. Formate fișiere

2.1 Fișier de intrare: ferma.txt

Format general:

ferma.txt
L L ZILE BANI
nume_leguma1 timp_cultivare1 cost1 pret_vanzare1
nume_leguma2 timp_cultivare2 cost2 pret_vanzare2
...
ROTATIE
leguma1 leguma2 (sau N/A daca nu are restrictii)
leguma3 leguma4 (sau N/A daca nu are restrictii)
...

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
  • 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 – secțiunea ce definește relațiile de rotație între legume
  • 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ă)
  • Toate legumele trebuie să apară în secțiunea ROTATIE, fie cu o restricție, fie cu N/A

Restricții:

  • Numărul total de tipuri de legume: 1 ≤ număr legume ≤ 20
  • Fiecare legumă apare cel mult o dată în lista de legume
  • În secțiunea ROTATIE, fiecare legumă din lista de legume trebuie să aibă o linie (fie cu o restricție de rotație, fie cu N/A)
ferma.txt
3 3 10 500
morcov 3 50 200
ceapa 2 30 150
castravete 4 80 300
roșie 5 100 400
ROTATIE
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:

  • planteaza – plantarea unei legume într-un pătrat liber sau eliberat
  • culege – culegerea unei legume mature (după ce timpul de cultivare a trecut) și vânzarea acesteia

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 (5p)

  • Teste automate (4p)
    • 8 teste × 0.5p = 4p
  • Fișier README.md (1p) care să conțină:
    • Nume și grupă
    • OS și IDE
    • Explicația organizării funcției `int main`
    • Strategia de maximizare a sumei finale (2-3 propoziții)

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:

  • Clonați repository-ul (`git clone`).
  • Lucrați doar în structura dată (nu ștergeți fișierele existente).

7. Exemple suplimentare

Exemplu complex:

ferma.txt
2 2 15 300
morcov 3 50 200
ceapa 2 40 160
ROTATIE
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
poo-is-ab/tema/2025/02_test.1761927415.txt.gz · Last modified: 2025/10/31 18:16 by marius.trifu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0