私のコードは基本的な8個のパズルの問題に対応していますが、より難しいパズル構成でテストすると無限ループになります。これを防ぐためにコードを編集してください。ループまたはサイクルを防ぐコードが含まれていることに注意してください。私は反復的な深さの最初の検索技術を含めてみましたが、それも機能しませんでした。誰かが私のコードを確認してください。デプスファーストサーチアルゴリズムが無限ループに陥るのを防ぐために8 Puzzle
/** Implementation for the Depth first search algorithm */
static boolean depthFirstSearch(String start, String out){
LinkedList<String> open = new LinkedList<String>();
open.add(start);
Set<String> visitedStates = new HashSet<String>(); // to prevent the cyle or loop
LinkedList<String> closed = new LinkedList<String>();
boolean isGoalState= false;
while((!open.isEmpty()) && (isGoalState != true)){
String x = open.removeFirst();
System.out.println(printPuzzle(x)+"\n\n");
jtr.append(printPuzzle(x) +"\n\n");
if(x.equals(out)){ // if x is the goal
isGoalState = true;
break;
}
else{
// generate children of x
LinkedList<String> children = getChildren(x);
closed.add(x); // put x on closed
open.remove(x); // since x is now in closed, take it out from open
//eliminate the children of X if its on open or closed ?
for(int i=0; i< children.size(); i++){
if(open.contains(children.get(i))){
children.remove(children.get(i));
}
else if(closed.contains(children.get(i))){
children.remove(children.get(i));
}
}
// put remaining children on left end of open
for(int i= children.size()-1 ; i>=0 ; i--){
if (!visitedStates.contains(children.get(i))) { // check if state already visited
open.addFirst(children.get(i)); // add last child first, and so on
visitedStates.add(children.get(i));
}
}
}
}
return true;
}
独自のコードをデバッグする方法を学ぶ必要があります。ここから始めてください:https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – shmosel
誰かが自分のコードをデバッグするように指示するのではなく、アルゴリズムを見直す人を尋ねました。あなたは間違っている。 –
あなたが求めるものをいつも得ることはできません。たとえあなたがそうしても、長期的にはそれほど助けにならないでしょう。独自のコードをデバッグすることを学ぶことは、効果的にコードを作成するために必要な最も重要なスキルの1つです。 – shmosel