4021 - Tablou 1: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(One intermediate revision by the same user not shown)
Line 42: Line 42:
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def generare_tablou(N, S):
def is_valid(tablou):
    # Verificare pe linii
    for linie in tablou:
        if len(set(linie)) != len(linie):
            return False
 
    # Verificare pe coloane
    for coloana in zip(*tablou):
        if len(set(coloana)) != len(coloana):
            return False
 
    return True
 
def generate_tablou(N, S):
     if N == 1:
     if N == 1:
         return [[S]]
         if S == 1:
      
            return [[1]]
        else:
            return [[0]]
 
     # Initializare tablou
     tablou = [[0] * N for _ in range(N)]
     tablou = [[0] * N for _ in range(N)]
   
 
     # Generare linie 1
     # Alegem coltul din stanga sus si coltul din dreapta jos
     for i in range(1, N):
     tablou[0][0] = 1
        tablou[0][i] = 1
     tablou[N - 1][N - 1] = S - (N - 1)
      
 
    # Generare coloana 1
     # Alegem coltul din stanga jos si coltul din dreapta sus
    for i in range(1, N):
     tablou[N - 1][0] = 1
        tablou[i][0] = 1
     tablou[0][N - 1] = S - (N - 1)
   
 
    # Calcul diferență minimă între cel mai mare și cel mai mic element
     return tablou if is_valid(tablou) else None
    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
# Citire date de intrare
with open("tablou.txt", "r") as fin:
with open("tablouin.txt", "r") as file:
     N, S = map(int, fin.readline().split())
     N, S = map(int, file.readline().split())


# Generare tablou
# Generare tablou
rezultat = generare_tablou(N, S)
tablou = generate_tablou(N, S)
 
# Scriere rezultat în fișierul de ieșire
with open("tablouout.txt", "w") as file:
    if tablou:
        for linie in tablou:
            file.write(' '.join(map(str, linie)) + '\n')
    else:
        file.write("0\n")
 


# Scriere rezultat in fisier
with open("tablou.txt", "w") as fout:
    for linie in rezultat:
        fout.write(" ".join(map(str, linie)) + "\n")
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 11:36, 29 December 2023

Cerinta[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

tablouin.txt
3 51
tablouout.txt
Datele introduse corespund restrictiilor impuse
4 6 7
7 4 6
6 7 4

Exemplul 2[edit | edit source]

tablouin.txt
0 -10
Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def is_valid(tablou):

   # Verificare pe linii
   for linie in tablou:
       if len(set(linie)) != len(linie):
           return False
   # Verificare pe coloane
   for coloana in zip(*tablou):
       if len(set(coloana)) != len(coloana):
           return False
   return True

def generate_tablou(N, S):

   if N == 1:
       if S == 1:
           return 1
       else:
           return 0
   # Initializare tablou
   tablou = [[0] * N for _ in range(N)]
   # Alegem coltul din stanga sus si coltul din dreapta jos
   tablou[0][0] = 1
   tablou[N - 1][N - 1] = S - (N - 1)
   # Alegem coltul din stanga jos si coltul din dreapta sus
   tablou[N - 1][0] = 1
   tablou[0][N - 1] = S - (N - 1)
   return tablou if is_valid(tablou) else None
  1. Citire date de intrare

with open("tablouin.txt", "r") as file:

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

tablou = generate_tablou(N, S)

  1. Scriere rezultat în fișierul de ieșire

with open("tablouout.txt", "w") as file:

   if tablou:
       for linie in tablou:
           file.write(' '.join(map(str, linie)) + '\n')
   else:
       file.write("0\n")


</syntaxhighlight>