3475 - TerenCasa low: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinţa == Gigel, un personaj cunoscut, vrea de data aceasta să își construiască o casă. Astfel, el cumpără un teren, reprezentat sub forma unei matrice binare cu '''n''' linii și '''m''' coloane, dar datorită lipsei de experiență în tranzacții imobiliare este păcălit, deoarece există pe teren zone afectate în care nu se poate construi, marcate în matrice cu '''0'''. Celelalte zone în care se poate construi sunt marcate cu '''1'''. Gigel acceptă că a...
 
No edit summary
 
Line 6: Line 6:
Acesta nu se descurcă singur și vă roagă pe voi să îl ajutați să își rezolve această problemă.
Acesta nu se descurcă singur și vă roagă pe voi să îl ajutați să își rezolve această problemă.
== Date de intrare ==
== Date de intrare ==
Fișierul de intrare '''terencasa_low.in''' conține pe prima linie numerele '''n m''', iar apoi '''n''' șiruri cu câte '''m''' valori de '''0''' sau '''1''' reprezentând elementele matricei reprezentării binare a terenului.
Fișierul de intrare '''terencasa_lowin.txt''' conține pe prima linie numerele '''n m''', iar apoi '''n''' șiruri cu câte '''m''' valori de '''0''' sau '''1''' reprezentând elementele matricei reprezentării binare a terenului.
== Date de ieșire ==
== Date de ieșire ==
Fișierul de ieșire '''terencasa_low.out''' va conține pe prima linie numărul '''L''', reprezentând dimensiunea bucății de teren pe care își va construi Gigel casa, iar pe a '''2'''-a linie '''4''' numere naturale separate prin câte un spațiu reprezentând coordonatele colțului stânga sus, respectiv dreapta jos a submatricei care corespunde bucății de teren.
Fișierul de ieșire '''terencasa_lowout.txt''' va conține pe prima linie numărul '''L''', reprezentând dimensiunea bucății de teren pe care își va construi Gigel casa, iar pe a '''2'''-a linie '''4''' numere naturale separate prin câte un spațiu reprezentând coordonatele colțului stânga sus, respectiv dreapta jos a submatricei care corespunde bucății de teren.
== Restricţii şi precizări ==
== Restricţii şi precizări ==
* 1 ⩽ n , m ⩽ 1000
* 1 ⩽ n , m ⩽ 1000
Line 14: Line 14:
* Prin bucată de teren cât mai mare se înțelege o submatrice care respectă proprietatea din enunț(este alcătuită exclusiv din elemente cu valoarea '''1''') și are număr maxim de elemente.
* Prin bucată de teren cât mai mare se înțelege o submatrice care respectă proprietatea din enunț(este alcătuită exclusiv din elemente cu valoarea '''1''') și are număr maxim de elemente.
== Exemplu ==
== Exemplu ==
; terencasa_low.in
; terencasa_lowin.txt
: 5 5
5 5
: 0 1 1 0 1
0 1 1 0 1
: 1 1 0 1 0
1 1 0 1 0
: 0 1 1 1 0
0 1 1 1 0
: 1 1 1 1 0
1 1 1 1 0
: 1 1 1 1 1
1 1 1 1 1
; terencasa_low.out
; terencasa_lowout.txt
: 3
Datele de intrare corespund restrictiilor impuse
: 3 2 5 4
3
3 2 5 4
== Explicatie ==
== Explicatie ==
În fișierul de intrare există o singură submatrice de dimensiune maximă. Aceasta are dimensiunea '''3''' și colțurile de coordonate '''3 2''', respectiv '''5 4'''.
În fișierul de intrare există o singură submatrice de dimensiune maximă. Aceasta are dimensiunea '''3''' și colțurile de coordonate '''3 2''', respectiv '''5 4'''.
== Exemplu 2 ==
== Exemplu 2 ==
; terencasa_low.in
; terencasa_lowin.txt
: 6 6
6 6
: 1 1 1 0 1 0
1 1 1 0 1 0
: 1 1 1 0 0 0
1 1 1 0 0 0
: 1 1 1 0 0 0
1 1 1 0 0 0
: 0 1 0 1 1 1
0 1 0 1 1 1
: 0 0 0 1 1 1
0 0 0 1 1 1
: 0 0 1 1 1 1
0 0 1 1 1 1
; terencasa_low.out
; terencasa_lowout.txt
: 3
Datele de intrare corespund restrictiilor impuse
: 1 1 3 3  
3
1 1 3 3  
== Explicatie ==
== Explicatie ==
În fișierul de intrare există '''2''' submatrice de dimensiune maximă. Dimensiunea acestora este '''3''', iar coordonatele minime sunt '''1 1''', respectiv '''3 3'''.
În fișierul de intrare există '''2''' submatrice de dimensiune maximă. Dimensiunea acestora este '''3''', iar coordonatele minime sunt '''1 1''', respectiv '''3 3'''.
== Exemplu 3 ==
; terencasa_lowin.txt
5 10001
1 1 1 0 1 0
1 1 1 0 0 0
1 1 1 0 0 0
0 1 0 1 1 1
0 0 0 1 1 1
0 0 1 1 1 1
; terencasa_lowout.txt
Datele de intrare nu corespund restrictiilor impuse
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# Funcția care găsește cea mai mare submatrice pătrată cu toate elementele 1
def max_square(matrix):
def max_square(matrix):
    # Obținem dimensiunile matricei
     n = len(matrix)
     n = len(matrix)
     m = len(matrix[0])
     m = len(matrix[0])
      
     s = [[0 for _ in range(m+1)] for _ in range(n+1)]
    # Inițializăm o matrice auxiliară cu 0
     max_i = max_j = 0  # Inițializează max_i și max_j cu 0
    S = [[0 for k in range(m+1)] for l in range(n+1)]
      
    # Parcurgem matricea și actualizăm matricea auxiliară
     for i in range(1, n+1):
     for i in range(1, n+1):
         for j in range(1, m+1):
         for j in range(1, m+1):
            # Dacă elementul curent este 1, actualizăm elementul corespunzător din matricea auxiliară
             if matrix[i-1][j-1] == 1:
             if (matrix[i-1][j-1] == 1):
                 s[i][j] = min(s[i][j-1], s[i-1][j], s[i-1][j-1]) + 1
                 S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
             else:
             else:
                 S[i][j] = 0
                 s[i][j] = 0
   
     max_of_s = max(max(row) for row in s)
    # Căutăm elementul maxim din matricea auxiliară
     max_of_s = S[0][0]
    max_i = 0
    max_j = 0
     for i in range(n+1):
     for i in range(n+1):
         for j in range(m+1):
         for j in range(m+1):
             if (max_of_s < S[i][j]):
             if s[i][j] == max_of_s:
                max_of_s = S[i][j]
                 max_i = i
                 max_i = i
                 max_j = j
                 max_j = j
   
                break
     # Returnăm coordonatele și dimensiunea celei mai mari submatrice pătrate cu toate elementele 1
     return max_i - max_of_s + 1, max_j - max_of_s + 1, max_i, max_j, max_of_s
    return (max_i, max_j, max_of_s)


# Citirea datelor de intrare
with open('terencasa_low.in', 'r') as f:
    n, m = map(int, f.readline().split())
    matrix = []
    for i in range(n):
        row = list(map(int, f.readline().split()))
        matrix.append(row)


# Apelarea funcției și afișarea rezultatelor
def validare(n, m, matrix):
i, j, max_of_s = max_square(matrix)
    if not 1 <= n <= 1000 or not 1 <= m <= 1000:
with open('terencasa_low.out', 'w') as f:
        return False, "Datele de intrare nu corespund restrictiilor impuse"
    f.write(str(max_of_s) + '\n')
    for row in matrix:
     f.write(str(i - max_of_s + 1) + ' ' + str(j - max_of_s + 1) + ' ' + str(i) + ' ' + str(j) + '\n')
        for val in row:
            if val not in [0, 1]:
                return False, "Datele de intrare nu corespund restrictiilor impuse"
    return True, "Datele de intrare corespund restrictiilor impuse"
 
 
def main():
    with open('terencasa_lowin.txt', 'r') as fin:
        n, m = map(int, fin.readline().split())
        matrix = [list(map(int, fin.readline().split())) for _ in range(n)]
 
    valid, message = validare(n, m, matrix)
    with open('terencasa_lowout.txt', 'w') as fout:
        fout.write(message + '\n')
        if not valid:
            return
 
     i1, j1, i2, j2, max_of_s = max_square(matrix)
    with open('terencasa_lowout.txt', 'a') as fout:
        fout.write(str(max_of_s) + '\n')
        fout.write(f'{i1} {j1} {i2} {j2}\n')
 
 
if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 15:38, 12 December 2023

Cerinţa[edit]

Gigel, un personaj cunoscut, vrea de data aceasta să își construiască o casă. Astfel, el cumpără un teren, reprezentat sub forma unei matrice binare cu n linii și m coloane, dar datorită lipsei de experiență în tranzacții imobiliare este păcălit, deoarece există pe teren zone afectate în care nu se poate construi, marcate în matrice cu 0. Celelalte zone în care se poate construi sunt marcate cu 1.

Gigel acceptă că a greșit și nu are altceva de făcut decât să își construiască casa unde este posibil. Acesta caută pe terenul achiziționat o bucată de teren pătrată de dimensiune cât mai mare, pentru care toate zonele ce o alcătuiesc să fie utilizabile(marcate cu 1 în matricea binară a reprezentării terenului), în care își va construi casa.

Acesta nu se descurcă singur și vă roagă pe voi să îl ajutați să își rezolve această problemă.

Date de intrare[edit]

Fișierul de intrare terencasa_lowin.txt conține pe prima linie numerele n m, iar apoi n șiruri cu câte m valori de 0 sau 1 reprezentând elementele matricei reprezentării binare a terenului.

Date de ieșire[edit]

Fișierul de ieșire terencasa_lowout.txt va conține pe prima linie numărul L, reprezentând dimensiunea bucății de teren pe care își va construi Gigel casa, iar pe a 2-a linie 4 numere naturale separate prin câte un spațiu reprezentând coordonatele colțului stânga sus, respectiv dreapta jos a submatricei care corespunde bucății de teren.

Restricţii şi precizări[edit]

  • 1 ⩽ n , m ⩽ 1000
  • dacă există mai multe submatrice de dimensiune maximă, Gigel o va alege pe cea care are coordonatele colțului stânga sus(implicit și ale celui dreapta jos) mai mici.
  • Prin bucată de teren cât mai mare se înțelege o submatrice care respectă proprietatea din enunț(este alcătuită exclusiv din elemente cu valoarea 1) și are număr maxim de elemente.

Exemplu[edit]

terencasa_lowin.txt
5 5
0 1 1 0 1
1 1 0 1 0
0 1 1 1 0
1 1 1 1 0
1 1 1 1 1
terencasa_lowout.txt
Datele de intrare corespund restrictiilor impuse
3
3 2 5 4

Explicatie[edit]

În fișierul de intrare există o singură submatrice de dimensiune maximă. Aceasta are dimensiunea 3 și colțurile de coordonate 3 2, respectiv 5 4.

Exemplu 2[edit]

terencasa_lowin.txt
6 6
1 1 1 0 1 0
1 1 1 0 0 0
1 1 1 0 0 0
0 1 0 1 1 1
0 0 0 1 1 1
0 0 1 1 1 1
terencasa_lowout.txt
Datele de intrare corespund restrictiilor impuse
3
1 1 3 3 

Explicatie[edit]

În fișierul de intrare există 2 submatrice de dimensiune maximă. Dimensiunea acestora este 3, iar coordonatele minime sunt 1 1, respectiv 3 3.

Exemplu 3[edit]

terencasa_lowin.txt
5 10001
1 1 1 0 1 0
1 1 1 0 0 0
1 1 1 0 0 0
0 1 0 1 1 1
0 0 0 1 1 1
0 0 1 1 1 1
terencasa_lowout.txt
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit]

<syntaxhighlight lang="python" line> def max_square(matrix):

   n = len(matrix)
   m = len(matrix[0])
   s = [[0 for _ in range(m+1)] for _ in range(n+1)]
   max_i = max_j = 0  # Inițializează max_i și max_j cu 0
   for i in range(1, n+1):
       for j in range(1, m+1):
           if matrix[i-1][j-1] == 1:
               s[i][j] = min(s[i][j-1], s[i-1][j], s[i-1][j-1]) + 1
           else:
               s[i][j] = 0
   max_of_s = max(max(row) for row in s)
   for i in range(n+1):
       for j in range(m+1):
           if s[i][j] == max_of_s:
               max_i = i
               max_j = j
               break
   return max_i - max_of_s + 1, max_j - max_of_s + 1, max_i, max_j, max_of_s


def validare(n, m, matrix):

   if not 1 <= n <= 1000 or not 1 <= m <= 1000:
       return False, "Datele de intrare nu corespund restrictiilor impuse"
   for row in matrix:
       for val in row:
           if val not in [0, 1]:
               return False, "Datele de intrare nu corespund restrictiilor impuse"
   return True, "Datele de intrare corespund restrictiilor impuse"


def main():

   with open('terencasa_lowin.txt', 'r') as fin:
       n, m = map(int, fin.readline().split())
       matrix = [list(map(int, fin.readline().split())) for _ in range(n)]
   valid, message = validare(n, m, matrix)
   with open('terencasa_lowout.txt', 'w') as fout:
       fout.write(message + '\n')
       if not valid:
           return
   i1, j1, i2, j2, max_of_s = max_square(matrix)
   with open('terencasa_lowout.txt', 'a') as fout:
       fout.write(str(max_of_s) + '\n')
       fout.write(f'{i1} {j1} {i2} {j2}\n')


if __name__ == "__main__":

   main()

</syntaxhighlight>