Un faraon foarte bogat voia să-şi ascundă comorile, aşa că a cerut să i se construiască un seif în forma unei piramide. El a mai cerut ca acesta să aibă o singură intrare (prin vârful piramidei), adică să se poată intra numai urcând pe trepte, şi anumite secvenţe de paşi să blocheze calea de acces (din vârf).
Peste ceva timp, după ce piramida este gata, faraonul vrea să-şi verifice comorile, dar nu-şi mai aminteste pe care trepte trebuie să calce. Faraonul e bătrân şi s-a gândit că va avea problema aceasta, aşa că a cerut următoarele pentru a-i fi mai uşor să găsească drumul:
Harta:
//cât timp linia (i) != prima linie şi coloana (j) != prima coloană dacă (rand() % 2) Mergi in SUS (linia i-1, coloana j); altfel Mergi in STANGA (linia i, coloana j-1); //pentru restul de paşi (după ce i == prima linie sau j == prima coloană), există un singur sens posibil
//MODULATOR = 2^31 - 1 #define MODULATOR 2147483647 #define MULTIP 1103515245 #define INCREMENT 12345 unsigned int seed = 0; int rand() { seed = (MULTIP * seed + INCREMENT) % MODULATOR; return seed; }
Punctul de plecare: Colţul de la baza piramidei este treapta notată cu 7.
Punctul de sosire: Colţul din vârful piramidei este treapta notată cu 1.
Faraonul ajunge pe o “margine” a hărţii când ajunge pe una din treptele cu valorile 5, 2, 4 sau 9.
matricea asociată acestei hărţi este:
1 | 4 | 9 |
2 | 3 | 8 |
5 | 6 | 7 |
Intrare pentru al doilea desen:
1 1 1 1 3 24 2 4 35 1 5 6 3 20 7 4
Iesire:
21 21 0 2
Explicaţii:
Toate drumurile valide (drumuri pe care poate merge faraonul) sunt:
7->20->3->1->2 Suma = 33 > 24; nesigur 7->20->5->1->2 Suma = 35 > 24; nesigur 7->20->5->4->2 Suma = 38 > 24; nesigur 7->6->5->1->2 Suma = 21 <= 24; sigur 7->6->5->4->2 Suma = 24 <= 24; sigur 7->6->35->4->2 Suma = 54 > 24; nesigur
Dintre cele 6 drumuri, doar 2 sunt sigure (afişat 2 pe ultimul rând la ieşire).
Observam că, pentru acest exemplu, alegerea optimului local duce la acelaşi rezultat cu optimul global (S1 = S2 = 21, afişat pe rândurile 1 şi 2).
Primele 12 valori obţinute la apelul rand() % 2 sunt: 1 1 0 1 0 1 1 1 1 0 0 1. De fapt, veţi ajunge să generaţi numai primele 9 valori (numai de atât aveţi nevoie pentru 4 simulări) pe acest exemplu, după cum urmează:
Prima încercare de drum (primele 2 apeluri rand: 1 1): poziţia = 7, opţiuni = 6 şi 20. SUS -> 6. poziţia = 6, opţiuni = 5 şi 35. SUS -> 35. (Implicit 35->4->2) Soluţia: 7->6->35->4->2 nesigur
A doua încercare de drum (urmatoarele 3 apeluri rand: 0 1 0): poziţia = 7, opţiuni = 6 şi 20. STANGA 20. poziţia = 20, opţiuni = 3 şi 5. SUS 5. poziţia = 5, opţiuni = 1 şi 4. STANGA 1. (Implicit 1->2) Soluţia: 7->20->5->1->2 nesigur
A treia încercare de drum(urmatoarele 2 apeluri rand: 1 1): Aceeaşi situaţie ca la prima incercare Solutia: 7->6->35->4->2 nesigur
A patra încercare de drum(urmatoarele 2 apeluri rand: 1 1): Aceeaşi situaţie ca la prima încercare Solutia: 7->6->35->4->2 nesigur
Deci: nu am găsit niciun drum sigur după nrMaxIncercari = 4 încercări (afişat 0 pe rândul 3).
21 0