1229 - Matrice Div Et Imp
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">
- 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>