Задание 26. Информатика. 2022-2
- Просмотры: 104
- Изменено: 25 ноября 2024
Для хранения двумерного цифрового растрового чёрно-белого изображения Петя сохранил в текстовом файле информацию и позициях всех пикселей чёрного цвета на изображении (номера рядов пикселей и номера чёрных пикселей в ряду). Для редактирования изображения Пете нужно изменить цвет с белого на чёрный всем имеющимся двум соседним белым пикселям, таким что слева и справа от них в том же ряду пиксели чёрные.
Найдите ряд с наименьшим номером, в котором есть два соседних пикселя, удовлетворяющих требованию Пети. Гарантируется, что есть хотя бы один ряд, удовлетворяющий этому условию. В ответе запишите два целых числа: номер ряда и наибольший номер пикселя в ряду из найденных в этом ряду подходящий пар белых пикселей.
Входные данные
В первой строке входного файла находится число \(N\) — количество рядов пикселей (натуральное число, не превышающее \( 10~000\)). Каждая из следующих \(N\) строк содержит два натуральных числа, не превышающих \(100~000\): номер ряда и номер чёрного пикселя в ряду.
Выходные данные
Два целых неотрицательных числа: номер ряда и наибольший номер пикселя в выбранной паре.
Пример входного файла:
\(7\)
\(30 \,\, 45\)
\(40 \,\, 17\)
\(40 \,\, 20\)
\(40 \,\, 30\)
\(40 \,\, 33\)
\(50 \,\, 10\)
\(50 \,\, 13\)
Условию задачи удовлетворяют три пары чисел: \(40\) и \(19\), \(40\) и \(32\), \(50\) и \(12\). Ответ для приведённого примера:
\(40\) \(32\)
Решение:
Python
f = open('input26_02.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] == 3: # Здесь может поместиться два белых символа
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
Ответ: 14480 13579