1824 - Pitic: Difference between revisions
Pagină nouă: ==Enunt== Carmen, piticul de gradina vrea sa meargă în vizita la piticul Tulosba. Pentru a ajunge la Tulosba, Carmen trebuie sa meargă printr-o rețea de N galerii, fiecare alcătuită din M sectoare. Rețeaua poate fi reprezentată printr-un tablou cu N linii, numerotate de la 1 la N și M coloane, numerotate de la 1 la M . Carmen ocupă sectorul 1 al galeriei 1. Tulosba ocupă sectorul M al galeriei 1. La galeria n se termina rețeaua și începe gradina unde sunt nișt... |
|||
(One intermediate revision by the same user not shown) | |||
Line 54: | Line 54: | ||
Modul 4: Dreapta, Diagonala sus, Diagonala jos | Modul 4: Dreapta, Diagonala sus, Diagonala jos | ||
==Rezolvare== | ==Rezolvare== | ||
<syntaxhighlight lang="python3" line="1"> | |||
def numar_moduri(n, m): | def numar_moduri(n, m): | ||
dp = [[0] * (m + 1) for _ in range(n + 1)] | |||
# Inițializăm prima coloană cu 1, deoarece Carmen poate să ajungă în oricare dintre cele n niveluri pornind de la nivelul 1 | |||
for i in range(1, n + 1): | |||
dp[i][1] = 1 | |||
# Calculăm numărul total de moduri | |||
for j in range(2, m + 1): | |||
for i in range(1, n + 1): | |||
dp[i][j] = dp[i][j - 1] # Carmen merge la dreapta | |||
if i - 1 > 0: | |||
dp[i][j] += dp[i - 1][j - 1] # Carmen merge pe diagonala sus | |||
if i + 1 <= n: | |||
dp[i][j] += dp[i + 1][j - 1] # Carmen merge pe diagonala jos | |||
return sum(dp[i][m] for i in range(1, n + 1)) | |||
if __name__ == "__main__": | if __name__ == "__main__": | ||
with open("pitic.in", "r") as f: | |||
n, m = map(int, f.readline().split()) | |||
rezultat = numar_moduri(n, m) | |||
with open("pitic.out", "w") as g: | |||
g.write(str(rezultat) + "\n") | |||
</syntaxhighlight> |
Latest revision as of 18:27, 11 January 2024
Enunt[edit | edit source]
Carmen, piticul de gradina vrea sa meargă în vizita la piticul Tulosba. Pentru a ajunge la Tulosba, Carmen trebuie sa meargă printr-o rețea de N galerii, fiecare alcătuită din M sectoare.
Rețeaua poate fi reprezentată printr-un tablou cu N linii, numerotate de la 1 la N și M coloane, numerotate de la 1 la M . Carmen ocupă sectorul 1 al galeriei 1. Tulosba ocupă sectorul M al galeriei 1. La galeria n se termina rețeaua și începe gradina unde sunt niște copii răi care vor sa-l spargă pe Carmen cu bâtele de Baseball.
Dacă sectorul curent a lui Carmen este (i,j), atunci se poate deplasa:
La dreapta, ajungând în sectorul (i,j+1) . Pe diagonala la dreapta în sus, ajungând în sectorul (i-1,j+1). Pe diagonala la dreapta în jos, ajungând în sectorul (i+1,j+1). Cerința Sa se afișeze în câte moduri poate Carmen sa ajungă la Tulosba.
Date de intrare[edit | edit source]
Fișierul de intrare pitic.in conține pe prima linie numerele n și m cu semnificația din problema.
Date de ieșire[edit | edit source]
Fișierul de ieșire pitic.out va conține pe prima linie numărul S, reprezentând în câte moduri poate sa ajungă Carmen la Tulosba.
Restricții și precizări[edit | edit source]
Carmen nu poate sa coboare sub nivelul 1 Carmen nu poate sa urce mai sus de nivelul n pentru ca o sa fie spart de copii 1 ≤ n ≤ 43 1 ≤ m ≤ 43 ==Exemplu==: pitic.in
3 3 pitic.out
2 pitic.in
7 1 pitic.out
1 pitic.in
4 4 pitic.out
4
Explicație[edit | edit source]
Exemplul 1 : Piticul Carmen poate sa meargă de 2 ori la dreapta sau o dată pe diagonala în sus la dreapta și odată pe diagonala în jos la dreapta.
Exemplul 2 : Piticul Carmen poate sa meargă doar la dreapta deoarece dacă urca pe nivelul 2 o sa ajungă în gradina.
Exemplul 3 : Modul 1: Dreapta de 3 ori Modul 2: Diagonala sus, Diagonala jos, Dreapta Modul 3: Diagonala sus, Dreapta , Diagonala jos Modul 4: Dreapta, Diagonala sus, Diagonala jos
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def numar_moduri(n, m):
dp = [[0] * (m + 1) for _ in range(n + 1)] # Inițializăm prima coloană cu 1, deoarece Carmen poate să ajungă în oricare dintre cele n niveluri pornind de la nivelul 1 for i in range(1, n + 1): dp[i][1] = 1 # Calculăm numărul total de moduri for j in range(2, m + 1): for i in range(1, n + 1): dp[i][j] = dp[i][j - 1] # Carmen merge la dreapta if i - 1 > 0: dp[i][j] += dp[i - 1][j - 1] # Carmen merge pe diagonala sus if i + 1 <= n: dp[i][j] += dp[i + 1][j - 1] # Carmen merge pe diagonala jos return sum(dp[i][m] for i in range(1, n + 1))
if __name__ == "__main__":
with open("pitic.in", "r") as f: n, m = map(int, f.readline().split()) rezultat = numar_moduri(n, m) with open("pitic.out", "w") as g: g.write(str(rezultat) + "\n")
</syntaxhighlight>