🎉 تهانينا! 🎉
لقد حللت المهمة ببراعة! كان صعبًا لكنك وجدت الحل الصحيح. أنت خطوة أقرب إلى الاحتراف! استمر، كل مرحلة تجعلك أقوى.
ProgerLib Python للجميع
تغيير السمة
أنت أستاذ كبير وتحتاج إلى كتابة برنامج يستقبل إحداثيات الفيلات الثمانية على المدخلات في رقعة الشطرنج القياسية 8 × 8 ويقوم بتحليل كامل لترتيبها.
yes . no . . ، والخلايا التي تحتوي على فارس يُشار إليها بالرمز Q . 1 1
2 3
3 5
4 7
5 2
6 4
7 6
8 8
نعم
1 1 و 8 8 يهاجمان بعضهما البعض قطريًا.
م . . . . . . .
. . م . . . . .
. . . . م . . .
. . . . . . م .
. م . . . . . .
. . . م . . . .
. . . . . م . .
. . . . . . . م
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()
🎉 تهانينا! 🎉
لقد حللت المهمة ببراعة! كان صعبًا لكنك وجدت الحل الصحيح. أنت خطوة أقرب إلى الاحتراف! استمر، كل مرحلة تجعلك أقوى.
AD
إعلان
جارٍ تشغيل الكود...