Ответы Mail.ru: Задача яндекса python, помогите решить пж

Для решения этой задачи следует создать функцию, которая будет анализировать каждый ход, обновляя состояние "бесконечной" игровой плоскости и проверяя условия победы после каждого хода. Для упрощения можно использовать словарь или хеш-таблицу для хранения состояния игры, используя координаты для ключей и метки игроков ('X' или 'O') для значений.

Проверку на победу можно эффективно проводить, анализируя только клетки вокруг последнего хода, так как только эти клетки могут образовать выигрышную линию длиной в пять фигур.

Рассмотрим псевдокод возможного решения:

 def check_win(board, x, y, symbol): 
    directions = [(0, 1), (1, 0), (1, 1), (1, -1)] # горизонталь, вертикаль, две диагонали 
    for dx, dy in directions: 
        count = 1 
        # проверяем в одном направлении 
        for i in range(1, 5): 
            if (x + dx*i, y + dy*i) in board and board[(x + dx*i, y + dy*i)] == symbol: 
                count += 1 
            else: 
                break 
        # проверяем в противоположном направлении 
        for i in range(1, 5): 
            if (x - dx*i, y - dy*i) in board and board[(x - dx*i, y - dy*i)] == symbol: 
                count += 1 
            else: 
                break 
        if count >= 5: 
            return True 
    return False 
 
def solve(n, moves): 
    board = {} 
    winner_declared = False 
    for i, (x, y) in enumerate(moves): 
        symbol = 'X' if i % 2 == 0 else 'O' 
        board[(x, y)] = symbol 
        if check_win(board, x, y, symbol) and not winner_declared: 
            print("First" if symbol == 'X' else "Second") 
            winner_declared = True 
        elif winner_declared:  # Если победитель уже был объявлен 
            return "Inattention" 
    return "Draw" if not winner_declared else "Inattention" 
   
n = int(input()) 
moves = [] 
for _ in range(n): 
    r, c = map(int, input().split()) 
    moves.append((r, c)) 
 
print(solve(n, moves)) 
 

print

Этот код сначала инициализирует игровое поле как пустой словарь, затем в цикле обрабатывает каждый ход, записывая в словарь фигуру текущего игрока по указанным координатам. Для каждого хода вызывается функция проверки на победу, которая возвращает True, если текущий ход образовал выигрышную комбинацию. Если функция обнаруживает победу, код выводит имя победившего игрока. Если после объявления победителя ходы продолжаются, выводится "Inattention". Если победитель не определен после всех ходов, выводится "Draw".