0

これはBoggleソルバーの一部です。文字列行列をトラバースする再帰的な方法を作成しました。MyLetteresすべての文字が保存され(例:a、b、c ...)、MyLetteres1空として初期化され、になりtrackerますfalse。これらの変数は、マトリックス内のどの座標に既にアクセスしたかを示します(座標に再度アクセスすることはできません)。隣接する座標にしか移動できません(スキップできません)。パラメーターString wordは、1文字(開始点)で初期化されます。int xint yは私の(x、y)座標です。無視int pしてint n

私が問題を抱えているのは、メソッドがすでに通過した座標を適切にマークできないようであり、次に実行するためにtracker(最後の行)をリセットできないように見えることです。falsegetPaths()

これが私のコードです助けてください!

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".
 }
4

1 に答える 1

1

これに関して私たちやあなた自身を助けるためにあなたができることはたくさんあります。最も重要なことは、範囲外に出ようとしている場合、それがどのラインで起こっているかを知る必要があるということです。デバッガーはこれを教えてくれます。これを教えてくれると非常に役立ちます。また、コーディングしている言語を教えていただけると助かります。私には Java のように見えます。

この場合、最後の 2 つのステートメントのように見えifますが、間違った値xy値を getPaths に渡しています。あなたが持っている

if(x-1>0&&y+1...getPaths(n,p,x+1,y-1

if(x+1<MyLetteres.length&&y-1>0...getPaths(n, p, x-1, y+1

それらを修正すると、おそらく範囲外の例外を修正できます。

x >= 0ちなみに、範囲をチェックするときは、とy >= 0の代わりにx > 0とをチェックしたいでしょうy > 0。配列インデックスが 0 であっても有効です。

x + 1 < MyLetteres.lengthまた、 ifと ifをチェックするのは技術的に不正確ですy + 1 < MyLetteres.length。これは、「x + 1 がボードの「高さ」よりも小さい」および「y + 1 がボードの「高さ」よりも小さい」と言っているからです。あなたのボードは正方形なので、うまくいきますが、正確にx + 1 < MyLetteres[0].lengthは、「x + 1はボードの「幅」よりも小さい」という方法です。

最後に、トラッカーのリセットに関しては、null を許可し、最上位の呼び出しで null として渡すことをお勧めします。null の場合、新しい単語の先頭にいることがわかり、独自の単語を作成して、後続のすべての再帰呼び出しに渡すことができます。

幸運を!

于 2013-02-12T23:07:00.907 に答える