1628 - Patrate 1: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Enunt == Pe o foaie cu pătrăţele se stabileşte un sistem de coordonate în care o intersecţie primeşte coordonatele (0,0), astfel încât fiecare intersecţie a caroiajului are coordonate numere întregi. Pe acest caroiaj se desenează un pavaj cu dreptunghiuri, în care fiecare dreptunghi are o lăţime L şi o înălţime H date, iar punctul de coordonate (0,0) este un colţ de dreptunghiuri. În acest mod, fiecare intersecţie a pavajului are coordonate de forma...
 
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
== Enunt ==
== Enunt ==


Pe o foaie cu pătrăţele se stabileşte un sistem de coordonate în care o intersecţie primeşte coordonatele (0,0), astfel încât fiecare intersecţie a caroiajului are coordonate numere întregi. Pe acest caroiaj se desenează un pavaj cu dreptunghiuri, în care fiecare dreptunghi are o lăţime L şi o înălţime H date, iar punctul de coordonate (0,0) este un colţ de dreptunghiuri. În acest mod, fiecare intersecţie a pavajului are coordonate de forma (L*i,H*j), cu i şi j întregi.
Pe o foaie cu pătrăţele se stabileşte un sistem de coordonate în care o intersecţie primeşte coordonatele (0,0), astfel încât fiecare intersecţie a caroiajului are coordonate numere întregi. Pe acest caroiaj se desenează un pavaj cu dreptunghiuri, în care fiecare dreptunghi are o lăţime '''L''' şi o înălţime '''H''' date, iar punctul de coordonate (0,0) este un colţ de dreptunghiuri. În acest mod, fiecare intersecţie a pavajului are coordonate de forma '''(L*i,H*j)''', cu '''i''' şi '''j''' întregi.


Se mai dă o pereche de întregi x şi y şi se consideră segmentul de dreaptă ce uneşte punctul de coordonate (0,0) cu punctul de coordonate (x,y).
Se mai dă o pereche de întregi x şi y şi se consideră segmentul de dreaptă ce uneşte punctul de coordonate (0,0) cu punctul de coordonate (x,y).
Line 11: Line 11:
== Date de intrare ==
== Date de intrare ==


Fişierul patrate1.txt conţine, pe o singură linie, 4 numere separate prin spaţii: L H X Y.
Fişierul '''patrate1in.txt''' conţine, pe o singură linie, 4 numere separate prin spaţii: '''L H X Y'''.


== Date de iesire ==
== Date de iesire ==


În fişierul patrate1.txt se va scrie un singur număr întreg reprezentând numărul de dreptunghiuri intersectate de segment.
În fişierul '''patrate1out.txt''' se va scrie un singur număr întreg reprezentând numărul de dreptunghiuri intersectate de segment.


== Restrictii si precizari ==
== Restrictii si precizari ==


*1 L, H, X, Y 2000000000
*1 ⩽ L, H, X, Y ⩽ 2000000000


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;patrate1in.txt
:4 2 6 3
:4 2 6 3
;Iesire
;patrate1out.txt
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:2
:2


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;patrate1in.txt
: -6 3 0.5 -2
: -6 3 0.5 -2
;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 numar_dreptunghiuri_intersectate(L, H, X, Y):
def verifica_restrictii(L, H, X, Y):
     numar_intersectii = 0
     if not (1 <= L <= 2000000000 and 1 <= H <= 2000000000):
        return False
    if not (abs(X) <= 2000000000 and abs(Y) <= 2000000000):
        return False
    return True
 
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a
 
def intersecteaza_dreptunghiuri(L, H, X, Y):
    d = gcd(abs(X), abs(Y))
    step_x = X // d
    step_y = Y // d
 
    count = 0
 
    for i in range(1, d + 1):
        x = i * step_x
        y = i * step_y


    # Verificăm fiecare dreptunghi
        if (x % L == 0 and y % H == 0) or (x % L == 0 and y % H == H) or (x % L == L and y % H == 0):
    for i in range(1, 1001):  # Presupunem că avem cel mult 1000 de dreptunghiuri pe axa X
            continue
        for j in range(1, 1001):  # Presupunem că avem cel mult 1000 de dreptunghiuri pe axa Y
            dreptunghi_x1 = L * i
            dreptunghi_x2 = L * (i + 1)
            dreptunghi_y1 = H * j
            dreptunghi_y2 = H * (j + 1)


            # Verificăm dacă segmentul intersectează dreptunghiul
        if (x % L != 0 and x % L <= L) and (y % H != 0 and y % H <= H):
            if (X <= dreptunghi_x1 and dreptunghi_x1 <= 0 and Y >= dreptunghi_y1 and Y <= dreptunghi_y2) or \
            count += 1
              (X >= 0 and X <= dreptunghi_x2 and Y >= dreptunghi_y1 and Y <= dreptunghi_y2) or \
              (X >= dreptunghi_x1 and X <= dreptunghi_x2 and Y >= dreptunghi_y1 and Y <= 0):
                numar_intersectii += 1


     return numar_intersectii
     return count


# Citire date de intrare
# Citire din fișierul de intrare
with open("patrate1.txt", "r") as file:
with open('patrate1in.txt', 'r') as file:
     L, H, X, Y = map(int, file.readline().split())
     L, H, X, Y = map(int, file.readline().split())


# Rezolvare problema
# Verificare restricții
rezultat = numar_dreptunghiuri_intersectate(L, H, X, Y)
if verifica_restrictii(L, H, X, Y):
    # Calculare numărul de dreptunghiuri intersectate
    rezultat = intersecteaza_dreptunghiuri(L, H, X, Y)


# Scriere rezultat în fișierul de ieșire
    # Scriere în fișierul de ieșire
with open("patrate1.txt", "w") as file_out:
    with open('patrate1out.txt', 'w') as file_out:
    file_out.write(str(rezultat))
        file_out.write(str(rezultat))
else:
    print("Date de intrare nevalide.")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 13:19, 27 December 2023

Enunt[edit | edit source]

Pe o foaie cu pătrăţele se stabileşte un sistem de coordonate în care o intersecţie primeşte coordonatele (0,0), astfel încât fiecare intersecţie a caroiajului are coordonate numere întregi. Pe acest caroiaj se desenează un pavaj cu dreptunghiuri, în care fiecare dreptunghi are o lăţime L şi o înălţime H date, iar punctul de coordonate (0,0) este un colţ de dreptunghiuri. În acest mod, fiecare intersecţie a pavajului are coordonate de forma (L*i,H*j), cu i şi j întregi.

Se mai dă o pereche de întregi x şi y şi se consideră segmentul de dreaptă ce uneşte punctul de coordonate (0,0) cu punctul de coordonate (x,y).

Cerinta[edit | edit source]

Se cere să se determine câte dreptunghiuri ale pavajului sunt intersectate de segmentul considerat. Un dreptunghi se consideră intersectat de segment dacă are cel puţin un punct interior comun. Cu alte cuvinte, dacă segmentul doar atinge colţul unui dreptunghi, nu se consideră că îl intersectează.

Date de intrare[edit | edit source]

Fişierul patrate1in.txt conţine, pe o singură linie, 4 numere separate prin spaţii: L H X Y.

Date de iesire[edit | edit source]

În fişierul patrate1out.txt se va scrie un singur număr întreg reprezentând numărul de dreptunghiuri intersectate de segment.

Restrictii si precizari[edit | edit source]

  • 1 ⩽ L, H, X, Y ⩽ 2000000000

Exemplul 1[edit | edit source]

patrate1in.txt
4 2 6 3
patrate1out.txt
Datele introduse corespund restrictiilor impuse
2

Exemplul 2[edit | edit source]

patrate1in.txt
-6 3 0.5 -2
Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verifica_restrictii(L, H, X, Y):

   if not (1 <= L <= 2000000000 and 1 <= H <= 2000000000):
       return False
   if not (abs(X) <= 2000000000 and abs(Y) <= 2000000000):
       return False
   return True

def gcd(a, b):

   while b:
       a, b = b, a % b
   return a

def intersecteaza_dreptunghiuri(L, H, X, Y):

   d = gcd(abs(X), abs(Y))
   step_x = X // d
   step_y = Y // d
   count = 0
   for i in range(1, d + 1):
       x = i * step_x
       y = i * step_y
       if (x % L == 0 and y % H == 0) or (x % L == 0 and y % H == H) or (x % L == L and y % H == 0):
           continue
       if (x % L != 0 and x % L <= L) and (y % H != 0 and y % H <= H):
           count += 1
   return count
  1. Citire din fișierul de intrare

with open('patrate1in.txt', 'r') as file:

   L, H, X, Y = map(int, file.readline().split())
  1. Verificare restricții

if verifica_restrictii(L, H, X, Y):

   # Calculare numărul de dreptunghiuri intersectate
   rezultat = intersecteaza_dreptunghiuri(L, H, X, Y)
   # Scriere în fișierul de ieșire
   with open('patrate1out.txt', 'w') as file_out:
       file_out.write(str(rezultat))

else:

   print("Date de intrare nevalide.")

</syntaxhighlight>