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