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

Альфа-бета отсечение

Оцените дерево игры минимаксом с альфа-бета отсечением и посчитайте, сколько листьев поиск действительно просмотрел.

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

  • Отслеживать границы alpha и beta
  • Пропускать ветви, которые не меняют результат
  • Измерять, сколько работы экономит отсечение

Условие

Альфа-бета отсечение даёт тот же ответ, что и минимакс, но пропускает ветви, которые не могут изменить результат. Оно отслеживает две границы: alpha — лучшая оценка, которую MAX уже гарантировал, и beta — лучшая оценка, которую уже гарантировал MIN.

Дерево игры полное: у каждого внутреннего узла branching потомков, и все листья на одной глубине. leaves перечисляет оценки листьев слева направо. Корень — узел MAX, уровни чередуются: MAX, MIN, MAX, …

Обходите потомков слева направо, начиная с alpha = -∞ и beta = +∞:

  • 'В узле MAX после каждого потомка: best = max(best, value), затем alpha = max(alpha, best).'
  • 'В узле MIN после каждого потомка: best = min(best, value), затем beta = min(beta, best).'
  • Как только alpha ≥ beta, пропустите оставшихся потомков узла.

Реализуйте alpha_beta(leaves, branching).

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

leaves: Оценки листьев слева направо; длина — степень branching.

branching: Число потомков у внутреннего узла.

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

Верните [value, evaluated]: минимаксное значение корня и число оценённых листьев.

Ограничения

2 ≤ branching ≤ 5, длина leaves = branching^depth, где 1 ≤ depth ≤ 8, не более 10 000 листьев

-1 000 ≤ каждый лист ≤ 1 000

Примеры

Пример 1
Ввод:
leaves = [3, 12, 8, 2, 4, 6, 14, 5, 2]
branching = 3

Ожидаемый вывод:
expected = [3, 7]
Ввод:
std::vector<long long> leaves = {3, 12, 8, 2, 4, 6, 14, 5, 2};
long long branching = 3;

Ожидаемый вывод:
std::vector<long long> expected = {3, 7};
Ввод:
long[] leaves = new long[] {3, 12, 8, 2, 4, 6, 14, 5, 2};
long branching = 3;

Ожидаемый вывод:
long[] expected = new long[] {3, 7};

Пояснение

Первый узел MIN видит 3, 12, 8 и возвращает 3, поэтому alpha = 3. Второй узел MIN видит 2, beta = 2 ≤ alpha, поэтому 4 и 6 пропускаются. Третий видит 14, 5, 2 и возвращает 2. Значение корня — max(3, 2, 2) = 3 после 7 из 9 листьев.

Пример 2
Ввод:
leaves = [5, 6, 7, 4]
branching = 2

Ожидаемый вывод:
expected = [5, 4]
Ввод:
std::vector<long long> leaves = {5, 6, 7, 4};
long long branching = 2;

Ожидаемый вывод:
std::vector<long long> expected = {5, 4};
Ввод:
long[] leaves = new long[] {5, 6, 7, 4};
long branching = 2;

Ожидаемый вывод:
long[] expected = new long[] {5, 4};

Пояснение

Левый узел MIN оценивает 5 и 6 и возвращает 5, поэтому alpha = 5. Правый узел MIN оценивает 7 (beta = 7), затем 4 (beta = 4 ≤ 5). Оценены все 4 листа, значение равно 5.

Ссылки

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

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

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

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