これはBoggleソルバーの一部です。文字列行列をトラバースする再帰的な方法を作成しました。MyLetteres
すべての文字が保存され(例:a、b、c ...)、MyLetteres1
空として初期化され、になりtracker
ますfalse
。これらの変数は、マトリックス内のどの座標に既にアクセスしたかを示します(座標に再度アクセスすることはできません)。隣接する座標にしか移動できません(スキップできません)。パラメーターString word
は、1文字(開始点)で初期化されます。int x
とint y
は私の(x、y)座標です。無視int p
してint n
。
私が問題を抱えているのは、メソッドがすでに通過した座標を適切にマークできないようであり、次に実行するためにtracker
(最後の行)をリセットできないように見えることです。false
getPaths()
これが私のコードです助けてください!
public void getPaths(int p, int n,int x, int y,String word, boolean tracker[][],boolean MyLetteres1[][],String MyLetteres[][],boolean checker)throws IOException{
if(word.length()>1)
checker=Check(word);//Check() just checks to see if its a word.
tracker[x][y]=true;//makes sure that the checkers never goes back over starting letter
if(x+1<MyLetteres.length&&tracker[x+1][y]==false){//up{
//checker=Check(word);//checks to see if its word
//reverse(word);
System.out.print("1 ("+x+","+y+"), ");//for debugging purposes
getPaths(n,p,x+1, y,word+MyLetteres[x+1][y], tracker,MyLetteres1,MyLetteres,true);//recursive part
}
if(x-1>0&&tracker[x-1][y]==false){//down
//checker=Check(word);
//reverse(word);
System.out.print("2 ("+x+","+y+"), ");
getPaths(n,p,x-1, y ,word+MyLetteres[x-1][y], tracker,MyLetteres1,MyLetteres,true);
}
if(y+1<MyLetteres.length&&tracker[x][y+1]==false){//right
//checker=Check(word);
//reverse(word);
System.out.print("3 ("+x+","+y+"), ");
getPaths(n, p,x , y+1,word+MyLetteres[x][y+1], tracker,MyLetteres1,MyLetteres,true);
}
if(y-1>0&&tracker[x][y-1]==false){//left
//checker=Check(word);
//reverse(word);
System.out.print("4 ("+x+","+y+"), ");
getPaths(n,p,x , y-1,word+MyLetteres[x][y-1], tracker,MyLetteres1,MyLetteres,true);
}
if(x+1<MyLetteres.length&&y+1<MyLetteres.length&&tracker[x+1][y+1]==false){//right, up
//checker=Check(word);
//reverse(word);
System.out.print("5 ("+x+","+y+"), ");
getPaths(n,p,x+1, y+1,word+MyLetteres[x+1][y+1], tracker,MyLetteres1,MyLetteres,true);
}
if(x-1>0&&y-1>0&&tracker[x-1][y-1]==false){//down, left
//checker=Check(word);
//reverse(word);
System.out.print("6 ("+x+","+y+"), ");
getPaths(n,p,x-1, y-1,word+MyLetteres[x-1][y-1], tracker,MyLetteres1,MyLetteres,true);
}
if(x-1>0&&y+1<MyLetteres.length&&tracker[x-1][y+1]==false){//down, right
//checker=Check(word);
//reverse(word);
System.out.print("7 ("+x+","+y+"), ");
getPaths(n,p,x+1, y-1, word+MyLetteres[x-1][y+1],tracker,MyLetteres1,MyLetteres,true);
}
if(x+1<MyLetteres.length&&y-1>0&&tracker[x+1][y-1]==false){//up, left
//checker=Check(word);
//reverse(word);
System.out.print("8 ("+x+","+y+"), ");
getPaths(n, p,x-1 , y+1, word+MyLetteres[x+1][y-1],tracker,MyLetteres1,MyLetteres,true);
}
tracker=deepCopyBoolean(MyLetteres1);//MyLetteres1 never changes so this is my attempt at resetting tracker (which does change) back to all false so that when the program starts a new path, nothing has been "visited".
}