4021 - Tablou 1: Difference between revisions

From Bitnami MediaWiki
 
(2 intermediate revisions by the same user not shown)
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 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.
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 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.
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 100
*'''1 < N &les; 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 ==
;Intrare
;tablouin.txt
:3 51
:3 51


;Iesire
;tablouout.txt
;Datele introduse corespund restrictiilor impuse
: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 ==
;Intrare
;tablouin.txt
:0 -10
:0 -10
;Iesire
:Datele introduse nu corespund restrictiilor impuse
;Datele introduse nu corespund restrictiilor impuse




== 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>