1229 - Matrice Div Et Imp

From Bitnami MediaWiki

Cerința[edit | edit source]

Marian a fost foarte interesat de metoda divide et impera și a primit de la profesorul său o problemă: se dă o matrice de dimensiune 2^n și ea trebuie parcursă după o anumită regulă bazată pe divide et impera. Pe baza a trei exemple, el trebuie să descopere regula și s-o aplice . Din păcate, acesta nu reusește și vă cere ajutorul. Vrea o rezolvare foarte eficienta atât din punct de vedere al timpului de execuție cât și a limitei de memorie.

Date de intrare[edit | edit source]

Fișierul de intrare matrice_div_et_impin.txt conține pe prima linie numărul n, iar pe celelalte 2^n linii câte 2^n numere naturale nenule separate prin spații.

Date de ieșire[edit | edit source]

Fișierul de ieșire matrice_div_et_impout.txt va conține o linie cu cele 2^n*2^n numere ale matricei , parcurse după respectiva regulă.

Restricții și precizări[edit | edit source]

  • 0 ≤ n ≤ 9
  • numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000

Exemplul 1[edit | edit source]

matrice_div_et_impin.txt
1
1 2
3 4
matrice_div_et_impout.txt
Datele introduse corespund restricțiilor impuse.
1 4 2 3

Exemplul 2[edit | edit source]

matrice_div_et_impin.txt
2
15 12 13 14
36 56 34 58
98 80 79 11
10 43 47 50
matrice_div_et_impout.txt
Datele introduse corespund restricțiilor impuse.
15 56 12 36 79 50 11 47 13 58 14 34 98 43 80 10

Exemplul 3[edit | edit source]

matrice_div_et_impin.txt
3
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
matrice_div_et_impout.txt
Datele introduse corespund restricțiilor impuse.
1 10 2 9 19 28 20 27 3 12 4 11 17 26 18 25 37 46 38 45 55 64 56 63 39 48 40 47 53 62 54 61 5 14 6 13 23 32 24 31 7 16 8 15 21 30 22 29 33 42 34 41 51 60 52 59 35 44 36 43 49 58 50 57

Exemplul 4[edit | edit source]

matrice_div_et_impin.txt
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 1000000001
matrice_div_et_impout.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 1229 - Matrice Div Et Imp

def validare(dimensiune_n, lista_matrice1): # functia de validare a datelor de intrare

   if dimensiune_n < 0 or dimensiune_n > 9:
       raise ValueError
   for linie in lista_matrice1:
       for numar in linie:
           if numar < 1 or numar > 1000000000:
               raise ValueError
   fisier_iesire.write("Datele de intrare corespund restrictiilor impuse\n")


def parcurgere(dimensiune_n, lista_matrice1, x, y): # functia de rezolvare

   if dimensiune_n == 0:
       return [lista_matrice1[x][y]]
   else:
       dimensiune_n -= 1
       dim = 2 ** dimensiune_n
       return (parcurgere(dimensiune_n, lista_matrice1, x, y) +
               parcurgere(dimensiune_n, lista_matrice1, x + dim, y + dim) +
               parcurgere(dimensiune_n, lista_matrice1, x, y + dim) +
               parcurgere(dimensiune_n, lista_matrice1, x + dim, y))


if __name__ == '__main__':

   fisier_intrare = open("matrice_div_et_impin.txt", "r")         # declararea fisierelor
   fisier_iesire = open("matrice_div_et_impout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   try:
       dim_n = int(fisier_intrare.readline())
       lista_matrice = [list(map(int, fisier_intrare.readline().split())) for _ in range(2**dim_n)]
       validare(dim_n, lista_matrice)                 # apelul functiei de validare
       rezultat = parcurgere(dim_n, lista_matrice, 0, 0)  # apelul functiei de rezolvare
       fisier_iesire.write(' '.join(map(str, rezultat)) + '\n')
   except ValueError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>