Pagini recente » Statistici Ioja Denisa (iojadenisa) | Profil pakapu | Istoria paginii utilizator/nobodyban | Cod sursa (job #1001480) | Diferente pentru monthly-2012/runda-9/solutii intre reviziile 15 si 14
Nu exista diferente intre titluri.
Diferente intre continut:
Primul lucru de facut este citirea matricii. Din pacate, aceasta nu se poate citi "clasic" (citind N * M numere intregi), deoarece ea contine si caractere "#". Astfel, va trebui sa citim ca sir de caractere fiecare dintre cele N * M numere, apoi sa le convertim in intregi. In cazul in care este vorba de caracterul "#", vom pune conventional valoarea -1. Pentru a citi doar un singur numar (sub forma de sir de caractere), se pot folosi functii precum scanf sau cin (pentru streamuri). Aceste functii citesc din fisier pana intalnesc un caracter alb (spatiu sau enter), apoi se opresc. Alternativ, se poate citi textul linie cu linie (in loc de numar cu numar) si apoi sa se parseze valorile de pe fiecare linie citita.
O restrictie importanta a problemei este ca fiecare element din matrice este diferit. Astfel, fiecarei valori din matrice (prin valoare nu am inclus elementele -1) ii corespunde o pozitie unica in matrice (prin pozitie ma refer la linia si coloana elementului in matrice). Mai formal, fiecare valoare x poate fi exprimata in mod unic sub forma unei perechi (i, j), astfel incat pe linia i si coloana j din matrice sa se afle valoarea x.
Sortam in ordine crescatoare valorile (din nou, ignoram valorile de -1). Acum, daca in loc sa scriem valorile in ordine crescatoare, am scrie pozitiile corespunzatoare fiecarei valori, am obtine un posibil drum. Daca acest drum nu e valid, nu va exista niciun alt drum care sa fie. Demonstratia acestei proprietati vine destul de simplu. Exista un singur mod de a sorta valorile, iar fiecarei valori ii corespunde o singura pozitie. Astfel, poate exista cel mult un drum.
Tot ce mai ramane de facut este sa verificam daca drumul ales este valid. Un drum este valid cand orice 2 elemente consecutive din el sunt vecine in matrice. Fie (x0, y0) o pozitie oarecare si (x1, y1) pozitia urmatoare din drum. Daca (x1, y1) nu este vecin al lui (x0, y0), drumul nu este valid. Cum vedem daca 2 pozitii (x0, y0) si (x1, y1) sunt vecine? O prima idee ar fi sa generam toti cei 8 vecini ai lui (x0, y0) ssi sa verificam daca (x1, y1) apare printre ei. O abordare mai rapida de scris ar fi sa observam ca (x0, y0) si (x1, y1) sunt vecine daca si numai daca <tex> \left | x0 - x1 \right | \leqslant 1 </tex> si <tex> \left | y0 - y1 \right | \leqslant 1 </tex>. Lasam demonstratia acestei proprietati ca tema cititorului.
O sursa care implementeaza ideea de mai sus este a lui Ciprian Olariu. Postez aici codul sursa: http://pastebin.com/ARRudC7t
Nu exista diferente intre securitate.
Topicul de forum nu a fost schimbat.