• 1
    数据输入输出
    • 任务
  • 2
    条件语句
    • 任务
  • 3
    for循环
    • 任务
  • 4
    字符串
    • 任务
  • 5
    while循环
    • 任务
  • 6
    列表
    • 任务
  • 7
    二维数组
    • 任务
  • 8
    字典
    • 任务
  • 9
    集合
    • 任务
  • 10
    函数与递归
    • 任务
  • к

课程 6. Lists

难度:

任务«吹灭蜡烛»

💻 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 互相斜向攻击。
Q . . . . . . .
. . Q . . . . .
. . . . Q . . .
. . . . . . Q .
. Q . . . . . .
. . . Q . . . .
. . . . . Q . .
. . . . . . . Q

提示

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

正在运行代码...

AI助手

你好!我是你的编程助手。随时向我提问关于 Python 的问题——我可以解释函数、方法,并帮助你完成当前任务!