4021 - Tablou 1

From Bitnami MediaWiki
Revision as of 11:41, 12 December 2023 by Mesarosdenisa (talk | contribs) (Pagină nouă: == 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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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 < 231
  • 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

<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
  1. Citire date de intrare

with open("tablou.in", "r") as fin:

   N, S = map(int, fin.readline().split())
  1. Generare tablou

rezultat = generare_tablou(N, S)

  1. Scriere rezultat in fisier

with open("tablou.out", "w") as fout:

   for linie in rezultat:
       fout.write(" ".join(map(str, linie)) + "\n")

</syntaxhighlight>