这是一个令人困惑的解决方案的一部分。
我用递归方法遍历一个字符串矩阵MyLetteres已存储所有字符(例如a、b、c…),MyLetteres1初始化为空,trackerfalse这些变量标记了我已经访问过的矩阵中的哪个坐标(我不能重新访问坐标)。我只能移动到相邻的坐标(不能跳过)参数String word用一个字母(起点)初始化int xint y是我的(x,y)坐标。忽略int pint 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".
 }

最佳答案

你可以做很多事情来帮助我们或者你自己。最重要的是,如果你出界了,你应该知道这是在哪条线上发生的你的调试器可以告诉你这一点,告诉我们这将有很大帮助。
告诉我们你用的是什么语言也会有帮助。在我看来像Java。
在本例中,在最后两个if语句中,您将错误的xy值传递给getpath。你有
if(x-1>0&&y+1getPaths(n,p,x+1,y-1

if(x+1<MyLetteres.length&&y-1>0getPaths(n, p, x-1, y+1
把它们修好,你可能会修好你的超范围异常。
顺便说一下,当你检查你的射程时,你可能想检查x >= 0y >= 0而不是x > 0y > 0数组索引等于0是有效的。
此外,检查是否x + 1 < MyLetteres.length和是否y + 1 < MyLetteres.length在技术上是不准确的,因为这意味着“x+1小于电路板的‘高度’”和“y+1小于电路板的‘高度’”。因为你的棋盘是正方形的,所以结果是可以的,但准确地说,你应该有x + 1 < MyLetteres[0].length,也就是说“是x+1小于棋盘的‘宽度’”。
最后,关于重置跟踪器,我建议允许它为null,并在顶级调用中将其作为null传递。如果它是空的,你知道你在一个新单词的开头,你可以创建你自己的并将它传递到所有后续的递归调用中。
祝你好运!

10-07 15:20