4021 - Tablou 1: Difference between revisions
No edit summary |
|||
Line 3: | Line 3: | ||
Generaţi un tablou bidimensional cu proprietăţile: | Generaţi un tablou bidimensional cu proprietăţile: | ||
*conţine N linii şi N coloane; | *conţine '''N''' linii şi '''N''' coloane; | ||
*elementele sale sunt numere naturale nenule; | *elementele sale sunt numere naturale nenule; | ||
*suma elementelor este egală cu numărul natural nenul S; | *suma elementelor este egală cu numărul natural nenul S; | ||
Line 11: | Line 11: | ||
== Date de intrare == | == Date de intrare == | ||
Fișierul de intrare | Fișierul de intrare '''tablouin.txt''' conţine pe prima linie două numere naturale nenule '''N S''', separate printr-un spaţiu, reprezentând numărul de linii şi de coloane ale tabloului, respectiv valoarea sumei tuturor elementelor din tablou. | ||
== Date de iesire == | == Date de iesire == | ||
Fișierul de ieșire | Fișierul de ieșire '''tablouout.txt''' va conţine N linii pe care se vor scrie elementele tabloului, câte o linie din tablou pe o linie din fişier; elementele de pe aceeaşi linie se vor separa prin câte un spaţiu. | ||
== Restrictii si precizari == | == Restrictii si precizari == | ||
*1 < N | *'''1 < N ⩽ 100''' | ||
*0 < S < 2^31 | *''''0 < S < 2^31''' | ||
*Dacă problema nu are soluţie, în fişierul de ieşire se va scrie cifra 0. | *Dacă problema nu are soluţie, în fişierul de ieşire se va scrie cifra 0. | ||
*Dacă problema are mai multe soluţii, în fişier se va scrie una singură. | *Dacă problema are mai multe soluţii, în fişier se va scrie una singură. | ||
== Exemplul 1 == | == Exemplul 1 == | ||
; | ;tablouin.txt | ||
:3 51 | :3 51 | ||
; | ;tablouout.txt | ||
:Datele introduse corespund restrictiilor impuse | |||
:4 6 7 | :4 6 7 | ||
:7 4 6 | :7 4 6 | ||
Line 35: | Line 35: | ||
== Exemplul 2 == | == Exemplul 2 == | ||
; | ;tablouin.txt | ||
:0 -10 | :0 -10 | ||
:Datele introduse nu corespund restrictiilor impuse | |||
Revision as of 09:37, 27 December 2023
Cerinta
Generaţi un tablou bidimensional cu proprietăţile:
- conţine N linii şi N coloane;
- elementele sale sunt numere naturale nenule;
- suma elementelor este egală cu numărul natural nenul S;
- pe nici o linie şi pe nici o coloană nu există două elemente identice;
- diferenţa dintre cel mai mare şi cel mai mic element ale tabloului este minimă.
Date de intrare
Fișierul de intrare tablouin.txt conţine pe prima linie două numere naturale nenule N S, separate printr-un spaţiu, reprezentând numărul de linii şi de coloane ale tabloului, respectiv valoarea sumei tuturor elementelor din tablou.
Date de iesire
Fișierul de ieșire tablouout.txt va conţine N linii pe care se vor scrie elementele tabloului, câte o linie din tablou pe o linie din fişier; elementele de pe aceeaşi linie se vor separa prin câte un spaţiu.
Restrictii si precizari
- 1 < N ⩽ 100
- '0 < S < 2^31
- Dacă problema nu are soluţie, în fişierul de ieşire se va scrie cifra 0.
- Dacă problema are mai multe soluţii, în fişier se va scrie una singură.
Exemplul 1
- tablouin.txt
- 3 51
- tablouout.txt
- Datele introduse corespund restrictiilor impuse
- 4 6 7
- 7 4 6
- 6 7 4
Exemplul 2
- tablouin.txt
- 0 -10
- Datele introduse nu corespund restrictiilor impuse
Rezolvare
<syntaxhighlight lang="python3" line="1"> def generare_tablou(N, S):
if N == 1: return S tablou = [[0] * N for _ in range(N)] # Generare linie 1 for i in range(1, N): tablou[0][i] = 1 # Generare coloana 1 for i in range(1, N): tablou[i][0] = 1 # Calcul diferență minimă între cel mai mare și cel mai mic element dif_minima = (S - N) // (N - 1) # Calcul suma elementelor de pe diagonala principala suma_diagonala_principala = (N - 1) * dif_minima + N # Completare elemente diagonala principala for i in range(1, N): tablou[i][i] = dif_minima + 1 # Completare elemente diagonala secundara for i in range(N - 1): tablou[i][N - 1 - i] = 1 # Ajustare ultimul element pentru a asigura suma dorită tablou[N - 1][0] = S - suma_diagonala_principala return tablou
- Citire date de intrare
with open("tablou.txt", "r") as fin:
N, S = map(int, fin.readline().split())
- Generare tablou
rezultat = generare_tablou(N, S)
- Scriere rezultat in fisier
with open("tablou.txt", "w") as fout:
for linie in rezultat: fout.write(" ".join(map(str, linie)) + "\n")
</syntaxhighlight>