Самый эффективный способ вычислить серию ходов в пасьянсе колышка - PullRequest
2 голосов
/ 01 сентября 2010

Учитывая произвольную конфигурацию доски пасьянса, самый эффективный способ вычислить любую серию ходов, которые приводят к позиции «конец игры».

Например, стандартная начальная позиция:

..***..
..***..
*******
***O***
*******
..***..
..***..

И позиция "окончания игры":

..OOO..
..OOO..
OOOOOOO
OOO*OOO
OOOOOOO
..OOO..
..OOO..

Peg Solitare описывается более подробно здесь: Wikipedia , мы рассматриваем вариант "английской доски".

Я совершенно уверен, что любую разумную стартовую плату на подходящем компьютере можно решить всего за несколько секунд, скажем, P4 3Ghz.

В настоящее время это моя лучшая стратегия:

def solve:
    for every possible move:
        make the move.
        if we haven't seen a rotation or flip of this board before:
            solve()
            if solved: return
        undo the move.

Ответы [ 2 ]

3 голосов
/ 02 сентября 2010

В статье в Википедии, на которую вы ссылаетесь, уже упоминается, что существует всего 3 626 632 возможных позиций на доске, поэтому любому современному компьютеру легко выполнить исчерпывающий поиск пространства.

Ваш алгоритм, приведенный выше, верен, уловка заключается в том, чтобы реализовать «не видел вращения или переворота этой доски раньше», что вы можете сделать, используя хеш-таблицу. Вам, вероятно, не нужна строка «отменить перемещение», поскольку реальная реализация передаст состояние платы в качестве аргумента рекурсивному вызову, поэтому вы будете использовать стек для хранения состояния.

Кроме того, неясно, что вы можете подразумевать под «эффективными».

Если вы хотите найти все последовательности ходов, которые приводят к выигрышному этапу, вам нужно провести исчерпывающий поиск.

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

0 голосов
/ 02 сентября 2010

Начните с завершенного состояния и идите назад во времени. Каждый ход - это прыжок, который оставляет дополнительный колышек на доске.

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

...