0973 - Cuvinte 1

From Bitnami MediaWiki
Revision as of 19:02, 12 December 2023 by Ghisa Catalin (talk | contribs) (Pagină nouă: == Cerinţa == Hercule trebuie sa strabată un labirint cu capcane reprezentat de o matrice cu '''n''' linii și '''m''' coloane. Pentru fiecare celula a labirintului, se cunoaște timpul exprimat în minute după care celula respectivă devine capcană. După ce o celula devine capcana, Hercule piere dacă intră în acea celulă. Initial Hercule se află în celula de coordonate '''(1, 1)''' și trebuie să ajungă în celula de cordonate '''(n,m)'''. Sa se afișeze numaru...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerinţa

Hercule trebuie sa strabată un labirint cu capcane reprezentat de o matrice cu n linii și m coloane. Pentru fiecare celula a labirintului, se cunoaște timpul exprimat în minute după care celula respectivă devine capcană. După ce o celula devine capcana, Hercule piere dacă intră în acea celulă. Initial Hercule se află în celula de coordonate (1, 1) și trebuie să ajungă în celula de cordonate (n,m).

Sa se afișeze numarul total de drumuri pe care le poate urma Hercule prin labirint, astfel încât Hercule să nu piară.

Date de intrare

Fișierul de intrare herculein.txt conține pe prima linie numerele n m, iar pe următoarele n linii câte m valori naturale.

Date de ieșire

Fișierul de ieșire herculeout.txt va conține pe prima linie numărul total de drumuri prin care Hercule poate ajunge în celula destinație.

Restricţii şi precizări

  • 1 ⩽ m,n ⩽ 10
  • Hercule nu poate intra de mai multe ori in aceeasi celula
  • Hercule are nevoie de un minut,ca sa treacă dintr-o celula într-una vecină
  • Hercule se deplasează pe direcțiile N-S și E-V.

Exemplu

herculein.txt
4 5
4 1 1 8 1 
6 3 4 5 1 
3 2 8 8 8 
1 3 4 2 9 
herculeout.txt
Datele de intrare corespund restrictiilor impuse
2


Exemplu 2

herculein.txt
4 11
4 1 1 8 1
6 3 4 5 1
3 2 8 8 8
1 3 4 2 9
herculeout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare

<syntaxhighlight lang="python" line> def numar_drumuri(matrice, n, m):

   dp = [[0 for _ in range(m)] for _ in range(n)]
   dp[0][0] = 1
   for i in range(n):
       for j in range(m):
           if i > 0 and matrice[i][j] > i + j:
               dp[i][j] += dp[i-1][j]
           if j > 0 and matrice[i][j] > i + j:
               dp[i][j] += dp[i][j-1]
   return dp[n-1][m-1]

def main():

   with open('herculein.txt', 'r') as fin:
       n, m = map(int, fin.readline().split())
       matrice = [list(map(int, linie.split())) for linie in fin]
   with open('herculeout.txt', 'w') as fout:
       if not (1 <= n <= 10 and 1 <= m <= 10):
           fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
           return
       fout.write("Datele de intrare corespund restrictiilor impuse\n")
       fout.write(str(numar_drumuri(matrice, n, m)) + '\n')

if __name__ == "__main__":

   main()

</syntaxhighlight>

Explicatie

Cele două trasee posibile ale lui Hercule sunt
1 0 0 0 0 
2 3 4 5 0 
0 0 0 6 7 
0 0 0 0 8
si
1 0 0 0 0 
2 3 4 0 0 
0 0 5 6 7 
0 0 0 0 8