Задача состоит в том, чтобы написать минимаксную функцию на выбранном вами языке, чтобы вывести следующий лучший ход в игре в крестики-нолики NxN с учетом текущего состояния доски . Входная плата может быть принята в виде матрицы, 2D-коллекции или чего-либо еще, что имеет смысл для вас, но соответствует правилам . Выход будет следующим лучшим ходом для того, чей ход будет в данный момент , где Х считается начатым .
Краткий обзор минимаксного алгоритма
Основная идея алгоритма минимакса состоит в том, чтобы перечислить все возможные результаты в виде DAG, а затем взвесить их с той выгодой, которую последовательность ходов приносит игроку, определяемой первым сделанным ходом. Все возможные исходы затем «разбиваются» на первый ход и оцениваются на основе суммы всех исходов (-1 для проигрыша, 0 для ничьей и 1 для выигрыша). В реализациях, где для игры требуется несколько игроков, вы перечисляете все возможные ходы игрока, а также все возможные ответы оппонентов. Например, в игре в крестики-нолики (после первого хода) есть 8 возможных первых ходов, которые вы можете сделать, и все они могут казаться равными при анализе только следующего хода. Но, перебирая все возможные результаты для каждого возможного набора шагов, которые приводят к окончательному результату, и суммируя их все,
Для лучшего, более глубокого и контекстуального описания алгоритма мини-макс в терминах крестики-нолики читайте здесь: http://neverstopbuilding.com/minimax
XKCD (только решение 3х3)
Правила
- Можно использовать любой язык, но внешние минимаксные библиотеки не допускаются.
- Выходными данными может быть координата (0-n, 0-n) или число (1-n * n), указывающее лучший следующий ход.
- В дополнение к этому вы должны быть в состоянии определить, когда лучшим вариантом является проигрыш или ничья, а не победа.
- То, как вы обозначаете проигрыш или ничью, опять зависит от вас.
- Ввод должен использовать традиционные X и O, и вы должны предположить, что X перемещается первым; пробелы могут быть представлены чем угодно.
- Вы можете предположить, что любые входные данные, входящие в вашу программу, имеют n O и n + 1 X, другими словами, вы можете предположить, что вы получаете правильно сформированную доску.
- Текущее состояние платы должно быть единственным входом в вашу программу. Если вы используете рекурсию, должны быть созданы вспомогательные методы для облегчения требований ввода. См. Https://codegolf.stackexchange.com/a/92851/59376 для уточнения.
- Любое значение 10> = n> = 1 должно поддерживаться; если ваша программа «истекает» при n> 10, я нахожу это также приемлемым, поскольку некоторые языки имеют значительно меньшую вычислительную мощность (особенно при использовании веб-консолей).
судейство
- Это код-гольф, поэтому выигрывает наименьшее количество байт программы, и стандартные лазейки повсеместно запрещены.
- В случае ничьей победит программа, которая поддерживает наибольшее «n».
Пример входов
2х2
[[X,O]
[-,-]]
Вывод: 2 или [0,1] (3 или [1,1] также могут быть правильными) (некоторая форма указания местоположения, произвольная, если вы можете легко объяснить используемый вами формат)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Выход: -1 (потеря)
Еще раз, любой входной формат, который вы хотите, разрешен, но X и O должны использоваться, предоставленные примеры не предназначены для того, чтобы ограничивать этот формат, просто чтобы вдохновить.