Задание 26. Информатика. 2022-4
- Просмотры: 83
- Изменено: 24 ноября 2024
Для хранения двумерного цифрового растрового чёрно-белого изображения Петя сохранил в текстовом файле информацию и позициях всех пикселей чёрного цвета на изображении (номера рядов пикселей и номера чёрных пикселей в ряду). Для редактирования изображения Пете нужно изменить цвет с белого на чёрный трём соседним подряд идущим белым пикселям, таким что слева и справа от них в том же ряду пиксели чёрные.
Найдите ряд с наименьшим номером, в котором есть три соседних подряд идущих белых пикселя, удовлетворяющих требованию Пети. Гарантируется, что есть хотя бы один ряд, удовлетворяющий этому условию. В ответе запишите два целых числа: номер ряда и наибольший номер пикселя в ряду из найденных в этом ряду подходящий пар белых пикселей.
Входные данные
В первой строке входного файла находится число \(N\) — количество рядов пикселей (натуральное число, не превышающее \( 10~000\)). Каждая из следующих \(N\) строк содержит два натуральных числа, не превышающих \(100~000\): номер ряда и номер чёрного пикселя в ряду.
Выходные данные
Два целых неотрицательных числа: номер ряда и наибольший номер пикселя в выбранной паре.
Пример входного файла:
\(7\)
\(30 \,\, 45\)
\(40 \,\, 17\)
\(40 \,\, 21\)
\(40 \,\, 30\)
\(40 \,\, 34\)
\(50 \,\, 10\)
\(50 \,\, 14\)
Условию задачи удовлетворяют три пары чисел: \(40\) и \(20\), \(40\) и \(33\), \(50\) и \(13\). Ответ для приведённого примера:
\(40\) \(33\)
Решение:
Python
f = open('input26_04.txt')
length = int(f.readline())
pixels = [tuple(map(int, s.split())) for s in f.readlines()]
pixels.sort()
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(reverse=True) # Сортируем. Нужно вывести наибольший пиксел
len_pix = len(curr_pix)
if len_pix > 1: # Если собранных пикселов больше 1
for k in range(1, len_pix):
if curr_pix[k-1] - curr_pix[k] == 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
Ответ: 12876 19283