3299 - Mostenire 2

De la Universitas MediaWiki
Versiunea din 26 iulie 2024 08:12, autor: RaulOtet (discuție | contribuții) (Pagină nouă: Fibocel tocmai a moștenit o pădure gigantică de formă dreptunghiulară pe care vrea să o transforme într-un parc de distracții pentru copii. Cum își dă seama că este foarte mult de lucru și nu știe de unde să înceapă, s-a decis ca mai întâi să numere câte pădurici se află în pădurea moștenită. O pădurice este o suprafață dreptunghiulară înconjurată în totalitate de copaci, cu cel puțin o poieniță oriunde în interior. O poieniță este o su...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

Fibocel tocmai a moștenit o pădure gigantică de formă dreptunghiulară pe care vrea să o transforme într-un parc de distracții pentru copii. Cum își dă seama că este foarte mult de lucru și nu știe de unde să înceapă, s-a decis ca mai întâi să numere câte pădurici se află în pădurea moștenită. O pădurice este o suprafață dreptunghiulară înconjurată în totalitate de copaci, cu cel puțin o poieniță oriunde în interior. O poieniță este o suprafață fără copaci. Cum Fibocel și-a dat seama că și acest lucru este dificil de realizat, s-a decis să vă ceară vouă ajutorul!

Cerința

Dându-se pădurea moștenită de Fibocel sub forma unui dreptunghi cu N linii și M coloane având doar valori de 0 și 1, unde 0 înseamnă suprafață fără copac iar 1 înseamnă suprafață cu copac, spuneți câte pădurici se regăsesc în interiorul pădurii moștenite.

Date de intrare

Fișierul de intrare mostenire.in conține pe prima linie două numere naturale N și M separate prin exact un spațiu reprezentând dimensiunea pădurii. Pe fiecare dintre următoarele N linii se găsesc exact M caractere fără spațiu între ele, având doar valori de 0 și de 1.

Date de ieșire

Fișierul de ieșire mostenire.out va conține un număr reprezentând răspunsul cerut de Fibocel.

Restricții și precizări

  • 1 ≤ N ≤ 100
  • 1 ≤ M ≤ 1000
  • Păduricile se pot intersecta între ele.
  • Pentru 15% dintre teste N, M ≤ 30.
  • Pentru alte 35% dintre teste, M ≤ 100.

Exemplu:

mostenire.in

5 4
1111
1010
1111
1010
1110

mostenire.out

3
def citire_date(nume_fisier):
    with open(nume_fisier, 'r') as f:
        N, M = map(int, f.readline().split())
        matrice = [list(map(int, f.readline().split())) for _ in range(N)]
    return N, M, matrice

def verifica_dreptunghi(matrice, x1, y1, x2, y2):
    # Verificam marginile dreptunghiului
    for i in range(x1, x2 + 1):
        if matrice[i][y1] != 1 or matrice[i][y2] != 1:
            return False
    for j in range(y1, y2 + 1):
        if matrice[x1][j] != 1 or matrice[x2][j] != 1:
            return False
    
    # Verificam daca exista cel putin un 0 in interior
    for i in range(x1 + 1, x2):
        for j in range(y1 + 1, y2):
            if matrice[i][j] == 0:
                return True

    return False

def numara_padurici(N, M, matrice):
    numar_padurici = 0
    
    for x1 in range(N):
        for y1 in range(M):
            for x2 in range(x1 + 1, N):
                for y2 in range(y1 + 1, M):
                    if verifica_dreptunghi(matrice, x1, y1, x2, y2):
                        numar_padurici += 1
    
    return numar_padurici

def scrie_rezultate(nume_fisier, numar_padurici):
    with open(nume_fisier, 'w') as f:
        f.write(f"{numar_padurici}\n")

# Main function
def main():
    N, M, matrice = citire_date('date.in')
    numar_padurici = numara_padurici(N, M, matrice)
    scrie_rezultate('date.out', numar_padurici)

if __name__ == '__main__':
    main()