Задание 26. Информатика. 2022-3
- Просмотры: 72
- Изменено: 22 ноября 2024
Для хранения двумерного цифрового растрового чёрно-белого изображения Петя сохранил в текстовом файле информацию и позициях всех пикселей чёрного цвета на изображении (номера рядов пикселей и номера чёрных пикселей в ряду). Для редактирования изображения Пете нужно изменить цвет с белого на чёрный всем имеющимся трём соседним подряд идущим белым пикселям, таким что слева и справа от них в том же ряду пиксели чёрные.
Найдите ряд с наибольшим номером, в котором есть три соседних пикселя, удовлетворяющих требованию Пети. Гарантируется, что есть хотя бы один ряд, удовлетворяющий этому условию. В ответе запишите два целых числа: номер ряда и наименьший номер пикселя в ряду из найденных в этом ряду подходящий пар белых пикселей.
Входные данные
В первой строке входного файла находится число \(N\) — количество рядов пикселей (натуральное число, не превышающее \( 10~000\)). Каждая из следующих \(N\) строк содержит два натуральных числа, не превышающих \(100~000\): номер ряда и номер чёрного пикселя в ряду.
Выходные данные
Два целых неотрицательных числа: номер ряда и наименьший номер пикселя в выбранной паре.
Пример входного файла:
\(7\)
\(20 \,\, 10\)
\(20 \,\, 14\)
\(30 \,\, 45\)
\(40 \,\, 17\)
\(40 \,\, 21\)
\(40 \,\, 30\)
\(40 \,\, 34\)
Условию задачи удовлетворяют три пары чисел: \(20\) и \(11\), \(40\) и \(18\), \(40\) и \(31\). Ответ для приведённого примера:
\(40\) \(18\)
Решение:
Python
f = open('input26_03.txt')
length = int(f.readline())
pixels = [tuple(map(int, s.split())) for s in f.readlines()]
pixels.sort(reverse=True)
curr_row = pixels[0][0] # Текущая строка
curr_pix = [pixels[0][1], ] # Список пикселов в строке curr_row
fl = False
for i in range(1, length):
if pixels[i][0] == curr_row:
curr_pix.append(pixels[i][1]) # Собираем все пикселы в строке curr_row
else: # Все пикселы собраны. Обрабатываем их и устанавливаем новый curr_row
curr_pix.sort() # Сортируем. Нужно вывести наименьший пиксел
len_pix = len(curr_pix)
if len_pix > 1: # Если собранных пикселов больше 1
for k in range(1, len_pix):
if curr_pix[k] - curr_pix[k-1] == 4: # Здесь может поместиться три белых символа
print(curr_row, curr_pix[k-1] + 1) # Мы их нашли. Выводим на экран
fl = True # Флаг сбрасываем в True. Нужно прервать внешний цикл
break # Прерываем внутренний for
if fl: # Если нашли нужные пикселы, прерываем внешний for
break
# Сюда попадаем, если нужных пикселов не нашли.
curr_row = pixels[i][0] # Устанавливаем указатель на новую строку и формируем
curr_pix = [pixels[i][1], ] # новый список пикселов для новой строки curr_row
Ответ: 78950 55774