Поскольку вы упоминаете глубину-в-первых (-search) (DFS), я полагаю, ваш лабиринт - это график, где узлы представляют комнаты. Узлы соединяются, если между комнатами есть незапертая дверь. График может быть циклическим.
У вас есть стартовая комната, и вы можете что-то искать в лабиринте. Таким образом, вы входите в комнату, проверяете каждую дверь, открыта ли она или у вас есть подходящий ключ, и открываете все возможные двери. Вы можете найти ключ. Затем вы добавляете этот ключ к своей связке ключей и перезапускаетесь в стартовой комнате.
Формально (адаптировано из de: wikipedia ; см. Также en.wikipedia ):
DFS(node, goal)
{
if (node == goal)
return node;
else if (node.contains(newKey))
{
addToKeyRing(newKey);
resetMaze();
DFS(startRoom, goal);
} else
{
stack := expand (node) // all unvisited rooms that can be entered pushed on stack
while (stack is not empty)
{
node' := pop(stack);
DFS(node', goal);
}
}
}