3935 - determinanta: Difference between revisions

From Bitnami MediaWiki
No edit summary
Line 40: Line 40:
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">


def calc_determinant(matrix, size):
def is_valid_input(n, positions):
     # Cazul de bază: matrice de dimensiune 2x2
     # Verificăm dacă toate pozițiile sunt în limitele matricei
     if size == 2:
     for l, c in positions:
         return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
         if not (1 <= l <= n and 1 <= c <= n):
 
            return False
    determinant = 0
     return True
    for i in range(size):
        # Eliminăm linia și coloana corespunzătoare elementului selectat
        sub_matrix = [row[:i] + row[i+1:] for row in matrix[1:]]
        sign = (-1) ** i
        determinant += sign * matrix[0][i] * calc_determinant(sub_matrix, size - 1)
 
     return determinant


def read_input(file_name):
def read_input(file_name):
     with open(file_name, 'r') as file:
     with open(file_name, 'r') as file:
         n = int(file.readline())
         n = int(file.readline())
        positions = [tuple(map(int, file.readline().split())) for _ in range(n)]
    if is_valid_input(n, positions):
         matrix = [[0] * n for _ in range(n)]
         matrix = [[0] * n for _ in range(n)]
         for _ in range(n):
         for l, c in positions:
            l, c = map(int, file.readline().split())
             matrix[l-1][c-1] = 1
             matrix[l-1][c-1] = 1
         return matrix, n
         return matrix, n
    else:
        raise ValueError("Invalid input data")


def write_output(file_name, result):
def write_output(file_name, result):
Line 71: Line 68:
     output_file = "determinantaout.txt"
     output_file = "determinantaout.txt"


     # Citim matricea și dimensiunea din fișierul de intrare
     try:
    matrix, size = read_input(input_file)
        # Citim matricea și dimensiunea din fișierul de intrare
   
        matrix, size = read_input(input_file)
    # Calculăm determinantul
 
    determinant_result = calc_determinant(matrix, size)
        # Calculăm determinantul
   
        determinant_result = calc_determinant(matrix, size)
    # Scriem rezultatul în fișierul de ieșire
 
    write_output(output_file, determinant_result)
        # Scriem rezultatul în fișierul de ieșire
        write_output(output_file, determinant_result)
    except ValueError as e:
        print(f"Error: {e}")




</syntaxhighlight>
</syntaxhighlight>

Revision as of 11:17, 29 December 2023

Cerinta

Se consideră o matrice cu n linii şi n coloane şi elemente egale cu 0 sau 1. Să se calculeze determinantul matricei.

Date de intrare

Fișierul de intrare determinantain.txt conține pe prima linie numărul n, iar pe următoarele n linii câte o pereche de numere naturale l, c, reprezentând faptul că elementul matricei de pe linia l şi coloana c are valoarea 1.

Date de iesire

Fișierul de ieșire determinantaout.txt va conține pe prima linie valoarea determinantului matricei.

Restrictii si precizari

  • 2 ⩽ n ⩽ 100.000
  • 1 ⩽ l,c ⩽ n
  • Exceptând elementele din poziţiile (l,c), care sunt egale cu 1, celelalte elemente ale matricei au valoarea 0.

Exemplul 1

determinantain.txt
3
1 1
2 2
3 3
Datele introduse corespund restrictiilor impuse.
determinantaout.txt
1

Exemplul 2

determinantain.txt
3
2 2
3 3
2 2
Datele introduse nu corespund restrictiilor impuse

Rezolvare

<syntaxhighlight lang="python3" line="1">

def is_valid_input(n, positions):

   # Verificăm dacă toate pozițiile sunt în limitele matricei
   for l, c in positions:
       if not (1 <= l <= n and 1 <= c <= n):
           return False
   return True

def read_input(file_name):

   with open(file_name, 'r') as file:
       n = int(file.readline())
       positions = [tuple(map(int, file.readline().split())) for _ in range(n)]
   if is_valid_input(n, positions):
       matrix = [[0] * n for _ in range(n)]
       for l, c in positions:
           matrix[l-1][c-1] = 1
       return matrix, n
   else:
       raise ValueError("Invalid input data")

def write_output(file_name, result):

   with open(file_name, 'w') as file:
       file.write(str(result) + '\n')

if __name__ == "__main__":

   input_file = "determinantain.txt"
   output_file = "determinantaout.txt"
   try:
       # Citim matricea și dimensiunea din fișierul de intrare
       matrix, size = read_input(input_file)
       # Calculăm determinantul
       determinant_result = calc_determinant(matrix, size)
       # Scriem rezultatul în fișierul de ieșire
       write_output(output_file, determinant_result)
   except ValueError as e:
       print(f"Error: {e}")


</syntaxhighlight>