1677 - Tort

From Bitnami MediaWiki
Revision as of 14:27, 6 January 2024 by Ramona Dragoș (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Pentru că s-a calificat la Olimpiada Națională de Informatică de la Craiova, NN îi pregătește lui XORin un tort. Tortul este dreptunghiular, format din linii și coloane numerotate de la 1 la N pentru linii și de la 1 la M pentru coloane. Tortul este format din bucăți de dimensiune 1x1, fiecare fiind acoperită cu un alt tip de glazură. În fiecare zi NN îi taie lui XORin câte o felie, alegând cel mai mare pătrat care conține bucăți acoperite cu același tip de glazură. În cazul în care există mai multe astfel de felii, NN o alege pe cea care are colțul din dreapta jos situat pe linia cu indicele cel mai mic. Dacă și în acest caz există mai multe posibilități, el o va alege pe cea cu colțul din dreapta jos situat în coloana cu indicele cel mai mic.

Cerința[edit | edit source]

Precizați latura și coordonatele colțului din dreapta jos pentru fiecare felie de tort primită, în ordinea specificată mai sus.

Date de intrare[edit | edit source]

Fișierul de intrare tortin.txt conține pe prima linie numerele naturale N și M, separate printr-un spațiu, reprezentând lungimea și lățimea tortului. Pe următoarele N linii se vor afla câte M caractere din mulțimea {‘0’, ..., ‘9’} reprezentând tipul de glazură cu care este acoperită bucata de pe linia i și coloana j a tortului. Liniile și coloanele sunt numerotate de la 1 la N, respectiv de la 1 la M. Pe linii nu există spațiu între oricare două caractere alăturate.

Date de ieșire[edit | edit source]

În fișierul de ieșire tortout.txt se vor afișa feliile de tort în ordinea în care XORin le va primi. Pentru fiecare felie se va afișa latura feliei, precum și coordonatele colțului din dreapta jos, valori separate prin câte un singur spațiu.

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

  • 1 ≤ N,M ≤ 500
  • Numerotarea liniilor și coloanelor nu se schimbă în urma operațiilor de eliminare.
  • Pentru 30% din teste se garantează că 1 ≤ N,M ≤ 35

Exemplu 1:[edit | edit source]

tortin.txt

4 7
1111111
1112333
1112333
4444333

tortout.txt

Datele de intrare sunt corecte
3 3 3
3 4 7
1 1 4
1 1 5
1 1 6
1 1 7
1 2 4
1 3 4
1 4 1
1 4 2
1 4 3
1 4 4

Explicatie[edit | edit source]

  • Prima felie primită de XORin va fi cea care are colțul din dreapta jos (3,3) și latura 3.
  • A doua felie va fi cea cu colțul din dreapta jos (4,7) și latura 3.
  • Următoarea felie va fi cea cu colțul din dreapta jos (1,4) și latură 1. ș.a.m.d.

Exemplu 2:[edit | edit source]

tortin.txt

0 0

tortout.txt

Nu au fost respectate cerintele impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python">

  1. 1677 - Tort

def read_input(file_name):

   try:
       with open(file_name, 'r') as file:
           N, M = map(int, file.readline().split())
           tort = [list(map(int, line.strip())) for line in file]
       
       if 1 <= N <= 500 and 1 <= M <= 500:
           return N, M, tort
       else:
           raise ValueError("Numerele nu respecta restricțiile.")
   except Exception as e:
       print(f"Nu au fost respectate cerintele impuse: {str(e)}")
       return None

def write_output(file_name, result):

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

def find_largest_square(N, M, tort, i, j):

   size = 1
   while i + size <= N and j + size <= M:
       if all(tort[x][y] == tort[i][j] for x in range(i, i + size) for y in range(j, j + size)):
           size += 1
       else:
           break
  1. 1677 - Tort
   return size - 1  # Return the side length of the largest square

def find_felii(N, M, tort):

   felii = []
   for i in range(N):
       for j in range(M):
           side_length = find_largest_square(N, M, tort, i, j)
           if side_length > 0:
               felii.append((side_length, i + side_length, j + side_length))
   felii.sort(key=lambda x: (x[0], x[1], x[2]))
   return felii

def main(input_file, output_file):

   result = read_input(input_file)
   if result is not None:
       N, M, tort = result
       felii = find_felii(N, M, tort)
       write_output(output_file, felii)

if __name__ == "__main__":

   main("tortin.txt", "tortout.txt")

</syntaxhighlight>