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

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

Входные данные
В первой строке входного файла находится число \(N\) — количество рядов пикселей (натуральное число, не превышающее \( 10~000\)). Каждая из следующих \(N\) строк содержит два натуральных числа, не превышающих \(100~000\): номер ряда и номер чёрного пикселя в ряду.

Выходные данные
Два целых неотрицательных числа: номер ряда и наименьший номер пикселя в выбранной паре.
Пример входного файла:
\(7\)
\(20 \,\, 10\)
\(20 \,\, 13\)
\(30 \,\, 45\)
\(40 \,\, 17\)
\(40 \,\, 20\)
\(40 \,\, 30\)
\(40 \,\, 33\)

Условию задачи удовлетворяют три пары чисел: \(20\) и \(11\), \(40\) и \(18\), \(40\) и \(31\). Ответ для приведённого примера:

\(40\)    \(18\)

Файл с данными

Решение:

Python


f = open('input26_01.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] == 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

Ответ: 67890    98765