4021 - Tablou 1: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 3 versiuni intermediare efectuate de același utilizator)
Linia 3: Linia 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;
Linia 11: Linia 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  
Linia 35: Linia 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.in", "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.out", "w") as fout:
    for linie in rezultat:
        fout.write(" ".join(map(str, linie)) + "\n")
</syntaxhighlight>
</syntaxhighlight>

Versiunea curentă din 29 decembrie 2023 11:36

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

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

# Citire date de intrare
with open("tablouin.txt", "r") as file:
    N, S = map(int, file.readline().split())

# Generare tablou
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")