ЕГЭ по информатике · задание 1
Программа находит соответствие.
Остальное решаешь сам
Самое муторное в задании 1 — понять, какая буква схемы какому номеру в таблице соответствует. Это и поручим программе. Она напечатает строчку букв, а длины, суммы и пути ты найдёшь по ней сам — как обычно.
11 класс · нужны только список, строка и цикл for
с чего всё начинается
На схеме видно, что с чем соединено, но длин на ней нет.
В таблице есть длины, но пункты в ней названы номерами, а не буквами.
договоримся сразу
Подбирает соответствие букв и номеров и печатает одну строчку:
АЕБВДЖГ
Первая буква — это П1, вторая — П2, и так до последней. Больше программа ничего не делает: длин она не знает и вопроса задачи не видит.
Подписываешь номера на схеме и дальше решаешь как всегда:
Это и проверяют на экзамене. Программа снимает не решение, а самую механическую его часть — сопоставление букв с номерами.
шаг 1
Девять линий, ни одной подписи. Больше со схемы ничего и не нужно.
Идём по рисунку и на каждую линию пишем две буквы, которые она
соединяет. Порядок букв внутри пары любой: 'АГ' и
'ГА' — одна и та же дорога.
graph = ['АГ', 'ГБ', 'БВ', 'ВЖ', 'ЖЕ',
'ЕА', 'ДА', 'ДБ', 'ЕД']
Список — это просто перечень, программа переберёт его весь. Удобно обойти сначала внешний контур по кругу, а потом дописать линии внутри него: так труднее пропустить дорогу.
Проверка: сколько линий на рисунке — столько пар в списке. Здесь девять.
шаг 2
Строка П1: числа в столбцах 2, 5 и 7 — пишем (1,2), (1,5), (1,7). Строка П2: столбцы 5 и 6, первый столбец уже посчитан.
Таблица симметрична: клетка П1–П2 и клетка П2–П1 — это одна и та же дорога. Поэтому берём только клетки выше диагонали, они подсвечены. Сами числа не нужны — важно лишь, что клетка не пустая.
table = [(1,2), (1,5), (1,7),
(2,5), (2,6),
(3,4), (3,5), (3,7),
(4,6)]
table должно выйти ровно столько же, сколько в
graph. Здесь и там девять. Не сошлось — пропущена линия
или клетка, и искать это лучше сейчас, а не после запуска.единственный новый инструмент
Соответствие — это расстановка: какая буква стоит на месте П1, какая на П2 и так далее. Расстановок конечное число, и Python выдаёт их все сам.
from itertools import *
for p in permutations('АБВ'):
print(''.join(p))
АБВ
АВБ
БАВ
БВА
ВАБ
ВБА
3 буквы — 6 расстановок
7 букв — 5 040
8 букв — 40 320
Компьютеру на такой перебор нужны доли секунды.
как отсеиваются лишние
letters = 'АБВГДЕЖ'
for p in permutations(letters):
p = ''.join(p)
ok = True
for a, b in table:
x = p[a-1]
y = p[b-1]
if x + y not in graph and y + x not in graph:
ok = False
break
if ok:
print(p)
graph можно было записать и как 'АГ',
и как 'ГА'. Программа не знает, как именно ты её написал,
поэтому смотрит оба варианта.что вывелось
АЕБВДЖГ
| П1 | П2 | П3 | П4 | П5 | П6 | П7 |
|---|---|---|---|---|---|---|
| А | Е | Б | В | Д | Ж | Г |
Читается слева направо: первая буква стоит на месте П1, вторая — П2, и так до конца. Подпиши эти номера прямо на схеме карандашом — и схема с таблицей станут одним рисунком.
В стоит на месте П4, Ж — на месте П6.
Смотрим клетку на пересечении П4 и П6.
Там 86 — это и есть ответ.
Клетка П4 — П6 подсвечена: 86 километров.
если вывелось не одно слово
БВДЖАЗЕГ
БЗДЖАВЕГ
Значит, на схеме есть два пункта с совершенно одинаковыми связями. Различить их нечем, и это не изъян условия, а замысел задачи.
Сравни строки: различаются они ровно в двух местах — здесь на П2 и П6. Спросили «какие номера могут соответствовать» этой паре — ответ 26.
Спросили про дорогу, которой эта пара не касается, — ответ одинаков по любой из строк, бери любую.
Такого не бывает: раз задачу составили, расстановка существует. Значит, схема или таблица переписаны с ошибкой. Ищи по порядку:
graph и в table должно быть поровну;letters — столько же, сколько кружков на схеме;table не больше числа пунктов;Пустой вывод — это не поломка, а подсказка: данные переписаны неверно. При решении на бумаге такой подсказки нет.
шаблон целиком
from itertools import * # 1. схема: пары соединённых букв graph = ['АГ', 'ГБ', 'БВ', 'ВЖ', 'ЖЕ', 'ЕА', 'ДА', 'ДБ', 'ЕД'] # 2. таблица: непустые клетки выше диагонали table = [(1,2), (1,5), (1,7), (2,5), (2,6), (3,4), (3,5), (3,7), (4,6)] # 3. буквы со схемы letters = 'АБВГДЕЖ' # эти два числа обязаны совпасть print(len(graph), len(table)) for p in permutations(letters): p = ''.join(p) ok = True for a, b in table: x = p[a-1] y = p[b-1] if x + y not in graph and y + x not in graph: ok = False break if ok: print(p)
строки меняются от задачи к
задаче:
graph, table, letters
переписывается без единой правки. Ни длин, ни вопроса задачи в коде нет — он ищет только соответствие. Значит, годится для любой формулировки задания 1.
памятка