Я использую Java для решения проблемы 8-Puzzle с использованием DFS.
Вот что я придумал:
public static boolean found = false;
public void solveDepthFirst(EightPuzzle currentState, int lastMove){
if(currentState.goal()){
System.out.println(currentState);
found = true;//to stop DFS when a solution is found (even if not optimal)
return;
}
for(int i=0;i<numMoves;++i){
if(found) return;
EightPuzzle e = currentState.move(i);//0 = up, 1 = down, 2 = left, 3= right
if(!e.equals(currentState) && i != lastMove
&& !visitedNodes.contains(e.toString())){
solveDepthFirst(e, i);
}
if(!visitedNodes.contains(currentState.toString())){
visitedNodes.add(currentState.toString());
}
}
}
! E.equals (currentState) проверяет, возможно ли перемещение.(если currentState.move (i) выходит за границы, move () возвращает то же состояние)
i! = lastMove гарантирует, что если при последнем перемещении вы двигались вправо, вы не двигаетесь влево сейчасэто не имеет смысла)
visitNodes - это HashSet посещенных узлов.
Недостаточно места в стеке.Когда я использую -xss10m для увеличения стекового пространства с 128k до 10m, алгоритм работает отлично.Однако я уверен, что есть масса других оптимизаций, которые можно сделать.
любые советы будут с благодарностью.