4021 - Tablou 1
De la Universitas MediaWiki
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 tablou.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 tablou.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
- Intrare
- 3 51
- Iesire
- Datele introduse corespund restrictiilor impuse
- 4 6 7
- 7 4 6
- 6 7 4
Exemplul 2
- Intrare
- 0 -10
- Iesire
- Datele introduse nu corespund restrictiilor impuse
Rezolvare
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.in", "r") as fin:
N, S = map(int, fin.readline().split())
# Generare tablou
rezultat = generare_tablou(N, S)
# Scriere rezultat in fisier
with open("tablou.out", "w") as fout:
for linie in rezultat:
fout.write(" ".join(map(str, linie)) + "\n")