Мини-урок · перед практикой

Ферзи

Проверяем совпадения строк, столбцов и диагоналей.

Как к ней подойти

Потренируйтесь хранить последовательность значений и обращаться к нужным элементам списка.

Коротко о теме

Список хранит элементы в определённом порядке. Прежде чем менять его, решите, нужны ли исходные индексы и можно ли пройти по данным один раз. При удалении элементов будьте внимательны: индексы сдвигаются.

Ключевая идея · Все пары

Каждую пару проверяем один раз. На фиксированной доске всего 28 пар.

Проверьте перед запуском

  • YES означает, что атакующая пара есть, а не что расстановка правильная.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Все пары

Каждую пару проверяем один раз. На фиксированной доске всего 28 пар.

a = [tuple(map(int, input().split())) for _ in range(8)]
attack = False
for i in range(8):
    for j in range(i):
        x, y = a[i]
        u, v = a[j]
        if x == u or y == v or abs(x - u) == abs(y - v):
            attack = True
print('YES' if attack else 'NO')

Время: O(q²) для q ферзей; здесь O(1). Память: O(q); здесь O(1).

Другой способ: Множества линий

На диагонали постоянны сумма или разность координат; повтор линии означает атаку.

rows, cols, diag1, diag2 = set(), set(), set(), set()
attack = False
for _ in range(8):
    x, y = map(int, input().split())
    if x in rows or y in cols or x - y in diag1 or x + y in diag2:
        attack = True
    rows.add(x)
    cols.add(y)
    diag1.add(x - y)
    diag2.add(x + y)
print('YES' if attack else 'NO')

Время: O(q) в среднем; здесь O(1). Память: O(q); здесь O(1).