Это, вероятно, полностью рудиментарно, но я все еще не уверен, как это сделать.
Предположим, у меня есть список action
функций / операторов / what-have-you и объекта x
. Для некоторого сохраненного значения y
я хочу проверить, возможно ли получить y
, применяя члены action
, и вернуть кратчайшую последовательность действий, которая принимает от x
до y
.
Самый простой способ сделать это - применить каждую возможную последовательность действий к x
по порядку, возвращая первую последовательность, чтобы получить y
(это всегда будет самая короткая возможная последовательность).
У меня есть смутное представление о том, как это можно сделать, но я не совсем уверен в спецификациях - что-то вроде:
//Set the maximum number of steps (to prevent overflow)
n = whatever
//Algorithm
<<start>>
While i<n
u = x
sequence = []
<<begin loop-like thing
u = apply actions to u
sequence = sequence.append(action.index(last action))
end loop-like thing>>
i = i + 1
if u==y
print sequence
else
<<return to start>>
(я использую <<stuff>>
в качестве заполнителя для случаев, когда я не знать, что такое stuff
).
Для конкретного примера приложения рассмотрим action
как список законных поворотов кубика Рубика, а x
- начальное (зашифрованное) состояние, и y
быть решенным состоянием. Это решает кубик Рубика, используя наименьшее количество возможных шагов, и печатает решение.
Вы также можете сделать это для решения лабиринтов, но это было бы глупо, потому что есть гораздо более быстрые способы решения лабиринтов.