Все задачи
Средне Решено: 0 Процент решений: 0%

Крестики-нолики с минимаксом

Выберите идеальный ход в крестиках-ноликах, перебрав всё дерево игры минимаксом.

Чему вы научитесь

  • Перебирать все возможные будущие ходы
  • Оценивать позиции с точки зрения ходящего игрока
  • Рекурсивно выбирать оптимальный ход

Условие

Минимакс — способ, которым игровые программы выбирают ходы: предположите, что оба игрока играют идеально, оцените каждую законченную партию и поднимите оценки вверх по дереву игры. Игрок, чей ход, выбирает потомка с наибольшей для себя оценкой.

Доска — строка из 9 символов, читаемая по строкам (индексы 0-8), из "X", "O" или "." для пустой клетки. X всегда ходит первым, поэтому ход X, когда у обоих одинаковое число отметок, иначе ход O.

Оценивайте законченную партию с точки зрения игрока, чей ход: +1 за победу, 0 за ничью, -1 за поражение. Верните пустую клетку, ход в которую имеет лучшую минимаксную оценку; если таких несколько, верните наименьший индекс.

Реализуйте best_move(board).

Входные данные

board: Допустимая позиция, в которой ещё никто не выиграл и есть хотя бы одна пустая клетка.

Выходные данные

Верните индекс (0-8) лучшего хода.

Ограничения

board состоит ровно из 9 символов, каждый — X, O или .

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

Примеры

Пример 1
Ввод:
board = "XX.OO...."

Ожидаемый вывод:
expected = 2
Ввод:
std::string board = "XX.OO....";

Ожидаемый вывод:
long long expected = 2;
Ввод:
string board = "XX.OO....";

Ожидаемый вывод:
long expected = 2;

Пояснение

У X и O по две отметки, значит, ходит X. Ход в 2 завершает верхнюю строку и сразу выигрывает (+1).

Пример 2
Ввод:
board = "X..OO...X"

Ожидаемый вывод:
expected = 5
Ввод:
std::string board = "X..OO...X";

Ожидаемый вывод:
long long expected = 5;
Ввод:
string board = "X..OO...X";

Ожидаемый вывод:
long expected = 5;

Пояснение

Ходит X. O угрожает завершить среднюю строку в клетке 5. Любой другой ход позволяет O выиграть (-1), а блок в 5 ведёт к ничьей (0), поэтому ответ — 5.

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.