🎉 ¡Felicidades! 🎉
¡Has resuelto la tarea brillantemente! Era un reto difícil, pero encontraste la solución correcta. ¡Estás un paso más cerca de dominar la programación! Sigue así, cada etapa superada te hace más fuerte.
ProgerLib Python para todos
You are a grandmaster and you need to write a program that receives the coordinates of the eight queens on the input on the standard chessboard 8 × 8 and conducts a complete analysis of their arrangement.
yes . no . . , y las celdas con una reina se indican con el símbolo Q . 1 1
2 3
3 5
4 7
5 2
6 4
7 6
8 8
Sí
1 1 y 8 8 se atacan diagonalmente.
Q. . . . . . .
. . Q. . . . .
. . . . Q. . .
. . . . . . Q.
. Q. . . . . .
. . . Q. . . .
. . . . . Q. .
. . . . . . . Q
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()
🎉 ¡Felicidades! 🎉
¡Has resuelto la tarea brillantemente! Era un reto difícil, pero encontraste la solución correcta. ¡Estás un paso más cerca de dominar la programación! Sigue así, cada etapa superada te hace más fuerte.
AD
Publicidad
Ejecutando tu código...