De ce contează?
Pui un film pe pauză. Cadrul înghețat de pe ecran îți arată tot ce se întâmplă chiar acum: unde e fiecare personaj, ce ține în mână. Din acel cadru poți ghici ce urmează, fără să derulezi tot filmul de la început. Acel cadru e „starea” sistemului.
Ce este starea
Starea unui sistem e toată informația care îl descrie complet la un moment dat — fotografia lui. Dacă ai starea curentă, poți calcula ce se întâmplă în pasul următor fără să te uiți în trecut.
Proprietatea cheie: o stare bună e suficientă pentru viitor. Dacă din starea curentă poți deduce starea următoare, nu mai ai nevoie de istoric — ții minte o singură fotografie, nu tot filmul.
Starea = reprezentarea, la un moment dat
Reprezentarea (lecția trecută) e cum stochezi sistemul. Starea e valoarea concretă a acelei reprezentări acum. Pe măsură ce simularea avansează, starea se schimbă, dar structura rămâne aceeași.
Exemplu: un robot pe o linie de 6 căsuțe. Starea = poziția lui.
| linie | . | . | R | . | . | . |
0 | 1 | 2 | 3 | 4 | 5 | |
R |
| linie | . | . | . | R | . | . |
0 | 1 | 2 | 3 | 4 | 5 | |
R |
Aici starea e doar un număr: poziția. Dar dacă mișcările ar depinde de direcția robotului, starea ar trebui să includă și direcția.
Ce intră în stare?
Întrebarea decisivă: „de ce informație am nevoie ca să calculez pasul următor?”. Tot ce influențează viitorul intră în stare; restul nu.
| Sistem | Starea minimă |
|---|---|
| Robot pe linie (doar stânga/dreapta) | poziția |
| Robot care se rotește | poziția și direcția |
| Parcaj | care locuri sunt ocupate |
| Șir de becuri | vectorul de 0/1 |
Implementare C++ — o stare care evoluează
#include <iostream>
using namespace std;
int main() {
int n = 6;
int pozRobot = 2; // STAREA: pozitia robotului pe linie
// un pas la dreapta = trecem la starea urmatoare
if (pozRobot + 1 < n)
pozRobot = pozRobot + 1; // noua stare depinde doar de starea veche
cout << "Pozitia robotului: " << pozRobot << "\n"; // 3
return 0;
}Noua stare (pozRobot după pas) se calculează doar din starea veche — exact proprietatea care face simularea simplă.
Complexitate
| Aspect | Cost |
|---|---|
| Memorie pentru o stare | O(mărimea reprezentării) |
| Trecerea la starea următoare | depinde de eveniment (vezi lecția următoare) |
Greșeli frecvente de concurs:
- Stare incompletă. Dacă lași pe dinafară ceva ce influențează viitorul (ex. direcția robotului), nu mai poți calcula corect pasul următor.
- Stare umflată cu istoric. Nu păstra toți pașii anteriori dacă pasul următor depinde doar de cel curent. Reții o fotografie, nu tot filmul.
- Confunzi starea cu rezultatul final. Starea se schimbă la fiecare pas; răspunsul problemei e adesea o valoare derivată din starea finală (sau acumulată pe drum).
- Modifici starea fără s-o actualizezi peste tot. Dacă starea are mai multe componente (poziție + direcție), un pas trebuie să le actualizeze pe toate cele afectate.
Recapitulare
- Starea = fotografia completă a sistemului acum; din ea poți calcula viitorul, fără istoric.
- Pune în stare exact ce influențează pasul următor (poziție, direcție, ocupări) — nimic în plus.
- Simularea = o succesiune de stări, fiecare calculată din cea precedentă.