Ферзи
Проверяем совпадения строк, столбцов и диагоналей.
Как к ней подойти
Потренируйтесь хранить последовательность значений и обращаться к нужным элементам списка.
Список хранит элементы в определённом порядке. Прежде чем менять его, решите, нужны ли исходные индексы и можно ли пройти по данным один раз. При удалении элементов будьте внимательны: индексы сдвигаются.
Каждую пару проверяем один раз. На фиксированной доске всего 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).