• 1
    Eingabe und Ausgabe
    • Aufgaben
  • 2
    Bedingungen
    • Aufgaben
  • 3
    For-Schleife
    • Aufgaben
  • 4
    Zeichenketten
    • Aufgaben
  • 5
    While-Schleife
    • Aufgaben
  • 6
    Listen
    • Aufgaben
  • 7
    2D-Arrays
    • Aufgaben
  • 8
    Wörterbücher
    • Aufgaben
  • 9
    Mengen
    • Aufgaben
  • 10
    Funktionen und Rekursion
    • Aufgaben
  • к

Lektion 6. Lists

Schwierigkeit:

Aufgabe«Ferze blasen»

💻 Python

Sie sind ein Großmeister und müssen ein Programm schreiben, das die Koordinaten von acht Damen auf dem Standard-Schachbrett 8 × 8 als Eingabe erhält und eine vollständige Analyse ihrer Aufstellung durchführt.

Eingabeformat

Acht Zeilen, jede davon enthält zwei ganze Zahlen von 1 bis 8, getrennt durch ein Leerzeichen — die Koordinaten einer Dame (zuerst die Zeilennummer, dann die Spaltennummer).

Ausgabeformat

  • Skript 1: Der Angriff wird entdeckt.
    Wenn mindestens ein Paar von Damen einander schlägt, soll das Programm:
    1. das Wort   yes ausgeben.
    2. in der nächsten Zeile die Koordinaten des ersten angegriffenen Paares und die Art des Angriffs angeben. Zum Beispiel: 1 1 und 8 8 schlagen einander diagonal.
    3. Danach das Schachbrett 8 × 8 mit den platzierten Damen zeichnen.
  • Skript 2: Kein Angriff.
    Wenn kein einziges Paar einander schlägt (die Aufstellung ist korrekt), soll das Programm:
    1. das Wort   no ausgeben.
    2. danach das Schachbrett 8 × 8 mit den platzierten Damen zeichnen.
  • Brettvisualisierung:
    Das Brett soll als 8x8-Gitter dargestellt werden. Leere Zellen werden durch das Symbol   . angezeigt, Zellen mit einer Dame durch das Symbol   Q .

Beispiel

Eingabe

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

Ausgabe

Ja
1 1 und 8 8 schlagen sich diagonal gegenseitig.
Q. . . . . . .
. . Q. . . . .
. . . . Q. . .
. . . . . . Q.
. Q. . . . . .
. . . Q. . . .
. . . . . Q. .
. . . . . . . Q

Hinweis

There will be no clue here, decide for yourself!

main.py
Test 1
Test 2
Test 3
Test 4
Test 5
Test 6
Test 7
Test 8
Test 9
Test 10
Entwicklerlösung
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()

🎉 Glückwunsch! 🎉

Du hast die Aufgabe hervorragend gelöst! Es war schwierig, aber du hast die Lösung gefunden. Du bist dem Meister einen Schritt näher! Mach weiter so.

AD

Werbung

red-snake blue-snake green-snake

Führe deinen Code aus...

KI-Assistent

Hallo! Ich bin dein Programmier-Assistent. Stelle mir beliebige Fragen zu Python — ich erkläre Funktionen, Methoden und helfe dir bei der aktuellen Aufgabe!