def read_and_validate_coordinates():
"""
Считывает 8 пар координат, проверяет их на корректность.
Возвращает список кортежей с координатами или None в случае ошибки.
"""
coords = []
try:
for _ in range(8):
# Считываем строку и разделяем на части
parts = input().split()
# Проверяем, что в строке ровно два элемента
if len(parts) != 2:
raise ValueError
# Преобразуем в целые числа
row, col = int(parts[0]), int(parts[1])
# Проверяем, что координаты в диапазоне от 1 до 8
if not (1 <= row <= 8 and 1 <= col <= 8):
raise ValueError
coords.append((row, col))
except (ValueError, IndexError):
# ValueError возникает при неудачном int() или если условия не выполнены
# IndexError может возникнуть, если split() дал меньше 2 элементов (хотя len(parts) это покрывает)
return None
return coords
def find_attacking_pair(coords):
"""
Ищет первую атакующую пару ферзей.
Возвращает кортеж (queen1, queen2, attack_type) или None, если атак нет.
"""
# Проверка на дубликаты координат (ферзи на одной клетке)
if len(coords) != len(set(coords)):
# Найдем первую дублирующуюся пару
seen = set()
duplicate = None
for q in coords:
if q in seen:
duplicate = q
break
seen.add(q)
# Найдем индексы дубликатов
indices = [i for i, x in enumerate(coords) if x == duplicate]
q1 = coords[indices[0]]
q2 = coords[indices[1]]
# Ферзи на одной клетке - это и горизонтальная, и вертикальная атака.
# Выберем "вертикали" для определенности.
return q1, q2, "вертикали"
# Проверяем все уникальные пары ферзей
for i in range(len(coords)):
for j in range(i + 1, len(coords)):
r1, c1 = coords[i]
r2, c2 = coords[j]
# Проверка по горизонтали
if r1 == r2:
return coords[i], coords[j], "горизонтали"
# Проверка по вертикали
if c1 == c2:
return coords[i], coords[j], "вертикали"
# Проверка по диагонали
if abs(r1 - r2) == abs(c1 - c2):
return coords[i], coords[j], "диагонали"
return None, None, None
def print_board(coords):
"""
Печатает шахматную доску 8x8 с расставленными ферзями.
"""
board = [['.' for _ in range(8)] for _ in range(8)]
for r, c in coords:
# Координаты (1,1) соответствуют индексу [0][0]
board[r - 1][c - 1] = 'Q'
for row in board:
print(' '.join(row))
def main():
"""
Главная функция программы.
"""
coordinates = read_and_validate_coordinates()
if coordinates is None:
print("Ошибка: координаты должны быть числами от 1 до 8.")
return
q1, q2, attack_type = find_attacking_pair(coordinates)
if attack_type:
print("YES")
print(f"{q1[0]} {q1[1]} и {q2[0]} {q2[1]} бьют друг друга по {attack_type}.")
print_board(coordinates)
else:
print("NO")
main()