0693 - Sahara

From Bitnami MediaWiki

Enunt[edit | edit source]

Undeva, în deșertul Sahara, ilustrul biolog Sahraa Gaea a conceput și construit un sistem de irigații ingenios, sistem cu care își propune să irige o zonă deșertică dreptunghiulară bogată în nutrienți minerali. Zona deșertică este împărțită în N*M pătrate de latură unitate. În fiecare pătrat se află un dispozitiv de picurare ce asigură o anumită cantitate de apă în funcție de comanda primită de la centrul de control al sistemului.

Sistemul de irigare este astfel conceput încât să irige (ude), pe baza unor comenzi automatizate, parcele dreptunghiulare ale regiunii deșertice.

Orice parcelă are laturile paralele cu laturile zonei deșertice și este identificată prin coordonatele colțurilor stânga-sus (x1,y1), respectiv dreapta-jos (x2,y2). La fiecare comandă se specifică parcela care va fi udată și cantitatea de apă (exprimată în litri) cu care va fi irigat fiecare pătrat al acesteia.

Un pătrat al zonei deșertice devine fertil dacă acumulează cel puțin Q litri de apă.

Cerința[edit | edit source]

Să se determine aria maximă a unei suprafețe conexe fertile. Prin aria unei suprafețe înțelegem numărul de pătrate ce compun suprafața. Orice două pătrate fertile care au o latură comună fac parte din aceeaşi suprafaţă conexă fertilă.

Date de intrare[edit | edit source]

Fişierul de intrare saharain.txt conţine pe prima linie trei numere naturale N M Q despărțite prin câte un spațiu, cu semnificația din enunț.

Pe cea de-a doua linie a fișierului se găsește un număr natural T. Pe fiecare dintre următoarele T linii se află descrierea parcelelor udate sub forma: x1 y1 x2 y2 q , adică cinci numere naturale despărțite prin spațiu, unde x1 y1 x2 y2 reprezintă coordonatele colțurilor stânga-sus, respectiv dreapta-jos ale parcelei, q2 cantitatea de apă cu care va fi irigat fiecare pătrat al parcelei.

Date de ieșire[edit | edit source]

Fişierul de ieşire saharaout.txt va conține o singură valoare ce reprezintă aria maximă a unei suprafețe conexe fertile.

Restricții și precizări[edit | edit source]

  • 2 ⩽ N, M ⩽ 1000
  • 1 ⩽ x1 ⩽ x2 ⩽ N, 1 ⩽ y1 ⩽ y2 ⩽ M
  • 1 ⩽ q ⩽ 1 000
  • 1 ⩽ Q ⩽ 10 000
  • 1 ⩽ T ⩽ 50 000
  • Inițial zona deșertică nu conține ”apă”;
  • Pot exista suprafeţe conexe fertile formate dintr-un singur pătrat fertil;
  • Parcelele se pot suprapune.

Exemplu 1[edit | edit source]

saharain.txt
8 7 5
7
1 1 3 6 1
4 2 5 7 2
2 3 4 7 3
1 2 4 3 3
5 1 6 3 4
5 5 7 6 2
6 4 8 7 3
saharaout.txt
10


Exemplu 2[edit | edit source]

saharain.txt
0 0 0
0
Nu au fost respectate cerintele impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 0693 - Sahara

def read_input(file_name):

   try:
       with open(file_name, 'r') as file:
           N, M, Q = map(int, file.readline().split())
           T = int(file.readline())
           parcels = []
           for _ in range(T):
               x1, y1, x2, y2, q = map(int, file.readline().split())
               parcels.append(((x1, y1), (x2, y2), q))
           return N, M, Q, T, parcels
   except Exception as e:
       print(f"Nu au fost respectate cerințele impuse: {str(e)}")
       return None

def write_output(file_name, result):

   with open(file_name, 'w') as file:
       if result is not None:
           file.write(str(result) + "\n")

def max_connected_area(N, M, Q, parcels):

   area = [[0] * M for _ in range(N)]
   def flood_fill(x, y, current_area, visited):
       if x < 0 or x >= N or y < 0 or y >= M or visited[x][y] or area[x][y] < Q:
           return 0
       visited[x][y] = True
       current_area += 1
       directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
       for dx, dy in directions:
           current_area += flood_fill(x + dx, y + dy, 0, visited)
       return current_area
   max_area = 0
   for parcel in parcels:
       (x1, y1), (x2, y2), q = parcel
       for i in range(x1 - 1, x2):
           for j in range(y1 - 1, y2):
               area[i][j] += q
   visited = [[False] * M for _ in range(N)]
   for i in range(N):
       for j in range(M):
           if not visited[i][j] and area[i][j] >= Q:
               current_area = flood_fill(i, j, 0, visited)
               max_area = max(max_area, current_area)
   return max_area

def main(input_file, output_file):

   result = read_input(input_file)
   if result is not None:
       N, M, Q, T, parcels = result
       result = max_connected_area(N, M, Q, parcels)
       write_output(output_file, result)

if __name__ == "__main__":

   main("saharain.txt", "saharaout.txt")

</syntaxhighlight>