Задание 26. Информатика. 2022-4

Для хранения двумерного цифрового растрового чёрно-белого изображения Петя сохранил в текстовом файле информацию и позициях всех пикселей чёрного цвета на изображении (номера рядов пикселей и номера чёрных пикселей в ряду). Для редактирования изображения Пете нужно изменить цвет с белого на чёрный трём соседним подряд идущим белым пикселям, таким что слева и справа от них в том же ряду пиксели чёрные.
Найдите ряд с наименьшим номером, в котором есть три соседних подряд идущих белых пикселя, удовлетворяющих требованию Пети. Гарантируется, что есть хотя бы один ряд, удовлетворяющий этому условию. В ответе запишите два целых числа: номер ряда и наибольший номер пикселя в ряду из найденных в этом ряду подходящий пар белых пикселей.

Входные данные
В первой строке входного файла находится число \(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