1677 - Tort
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
Precizați latura și coordonatele colțului din dreapta jos pentru fiecare felie de tort primită, în ordinea specificată mai sus.
Date de intrare
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
Î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
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:
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
- 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:
tortin.txt
0 0
tortout.txt
Nu au fost respectate cerintele impuse
Rezolvare
<syntaxhighlight lang="python">
- 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
- 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>