• 1
    إدخال وإخراج البيانات
    • المهام
  • 2
    الشروط
    • المهام
  • 3
    حلقة for
    • المهام
  • 4
    السلاسل النصية
    • المهام
  • 5
    حلقة while
    • المهام
  • 6
    القوائم
    • المهام
  • 7
    مصفوفات ثنائية الأبعاد
    • المهام
  • 8
    القواميس
    • المهام
  • 9
    المجموعات
    • المهام
  • 10
    الدوال والتكرار
    • المهام
  • к

درس 6. Lists

الصعوبة:

иконка человека красный иконка человека белая иконка человека зеленая Pythonlib

مسألة«تفجير الفيرز»

💻 Python

أنت أستاذ كبير وتحتاج إلى كتابة برنامج يستقبل إحداثيات الفيلات الثمانية على المدخلات في رقعة الشطرنج القياسية 8 × 8 ويقوم بتحليل كامل لترتيبها.

تنسيق الإدخال

ثمانية أسطر، يحتوي كل منها على عددين صحيحين من 1 إلى 8، مفصولين بمسافة & mdash; إحداثيات ملكة واحدة (رقم الصف أولاً، ثم رقم العمود).

تنسيق الإخراج

rn
    rn
  • السيناريو 1: تم اكتشاف الهجوم.
    إذا كان هناك زوج واحد على الأقل من الفرسان يهاجم كل منهما الآخر، يجب أن يقوم البرنامج بما يلي: rn
      rn
    1. عرض الكلمة   yes .
    2. rn
    3. في السطر التالي، حدد إحداثيات أول زوج تم الهجوم عليه ونوع الهجوم. على سبيل المثال: 1 1 و 8 8 يهاجمان بعضهما قطريًا.
    4. rn
    5. بعد ذلك، ارسم رقعة الشطرنج 8 × 8 مع الفرسان المرتبة.
    6. rn
    rn
  • rn
  • السيناريو 2: لا يوجد هجوم.
    إذا لم يكن هناك أي زوج يهاجم الآخر (الترتيب صحيح)، يجب أن يقوم البرنامج بما يلي: rn
      rn
    1. عرض الكلمة   no .
    2. rn
    3. بعد ذلك، ارسم رقعة الشطرنج 8 × 8 مع الفرسان المرتبة.
    4. rn
    rn
  • rn
  • عرض الرقعة:
    يجب عرض الرقعة على شكل شبكة 8x8. الخلايا الفارغة يُشار إليها بالرمز   . ، والخلايا التي تحتوي على فارس يُشار إليها بالرمز   Q .
  • rn
rn

مثال

إدخال

1 1
2 3
3 5
4 7
5 2
6 4
7 6
8 8

إخراج

نعم
1 1 و 8 8 يهاجمان بعضهما البعض قطريًا.
م . . . . . . .
. . م . . . . .
. . . . م . . .
. . . . . . م .
. م . . . . . .
. . . م . . . .
. . . . . م . .
. . . . . . . م

تلميح

There will be no clue here, decide for yourself!

main.py
اختبار 1
اختبار 2
اختبار 3
اختبار 4
اختبار 5
اختبار 6
اختبار 7
اختبار 8
اختبار 9
اختبار 10
حل المطور
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

إعلان

red-snake blue-snake green-snake

جارٍ تشغيل الكود...

مساعد الذكاء الاصطناعي

مرحباً! أنا مساعدك في البرمجة. اسألني أي شيء عن Python — يمكنني شرح الدوال والطرق ومساعدتك في المهمة الحالية!