Algorithm 在我的递归方法中,要导航并查找4X4矩阵中的所有字母组合,请保持超出范围

Algorithm 在我的递归方法中,要导航并查找4X4矩阵中的所有字母组合,请保持超出范围,algorithm,recursion,boolean,solver,boggle,Algorithm,Recursion,Boolean,Solver,Boggle,这是Boggle解算器的一部分。 我使用递归方法遍历字符串矩阵MyLetteres存储了所有字符(例如a、b、c…),MyLetteres1初始化为空,tracker为false。这些变量标记了我已经访问过的矩阵中的坐标(我无法重新访问坐标)。我只能移动到相邻的坐标(不能跳过)。参数字符串单词用一个字母(起点)初始化intx和inty是我的(x,y)坐标。忽略int p和int n 我遇到的问题是,我似乎无法正确标记该方法已经过的坐标,然后我似乎无法将跟踪器(最后一行)重置为false,以便下次

这是Boggle解算器的一部分。 我使用递归方法遍历字符串矩阵
MyLetteres
存储了所有字符(例如a、b、c…),
MyLetteres1
初始化为空,
tracker
false
。这些变量标记了我已经访问过的矩阵中的坐标(我无法重新访问坐标)。我只能移动到相邻的坐标(不能跳过)。参数
字符串单词
用一个字母(起点)初始化
intx
inty
是我的(x,y)坐标。忽略
int p
int n

我遇到的问题是,我似乎无法正确标记该方法已经过的坐标,然后我似乎无法将
跟踪器
(最后一行)重置为
false
,以便下次运行
getpath()

这是我的密码,请帮忙

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".
 }
public void getpath(int p,int n,int x,int y,String word,boolean tracker[]],boolean myletters1[]],String myletters[]],boolean checker)引发IOException{
if(word.length()>1)
checker=Check(word);//Check()只是检查它是否是一个单词。
tracker[x][y]=true;//确保跳棋不会返回起始字母
如果(x+10&&tracker[x-1][y]==false){//down
//checker=支票(word);
//反面(字);
系统输出打印(“2”(“+x+”,“+y+”)”);
getpath(n,p,x-1,y,word+MyLetteres[x-1][y],tracker,MyLetteres1,MyLetteres,true);
}
如果(y+10&&tracker[x][y-1]==false){//左
//checker=支票(word);
//反面(字);
系统输出打印(“4”(“+x+”,“+y+”)”);
getpath(n,p,x,y-1,word+MyLetteres[x][y-1],tracker,MyLetteres1,MyLetteres,true);
}
如果(x+10&&tracker[x-1][y-1]==false){//down,左
//checker=支票(word);
//反面(字);
系统输出打印(“6”(“+x+”,“+y+”);
getpath(n,p,x-1,y-1,word+MyLetteres[x-1][y-1],tracker,MyLetteres1,MyLetteres,true);
}

如果(x-1>0&&y+1你可以做很多事情来帮助我们或你自己。最重要的是,如果你越界了,你应该知道它发生在哪一行。你的调试器可以告诉你这一点,告诉我们这将非常有帮助。 告诉我们你用什么语言编码也会有帮助。我觉得它像Java

在本例中,在最后两个
if
语句中,您将错误的
x
y
值传递到getpath

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

if(x+10
getpath(n,p,x-1,y+1

修复这些,您可能会修复超出范围的异常

顺便说一句,在检查范围时,您可能希望检查
x>=0
y>=0
,而不是
x>0
y>0
。数组索引等于0是有效的

此外,检查
x+1
y+1
在技术上是不准确的,因为这意味着“x+1小于电路板的“高度”和“y+1小于电路板的“高度”。因为你的电路板是正方形的,所以它工作正常,但准确地说,你应该有
x+1,意思是“x+1小于电路板的“宽度”

最后,对于重置跟踪器,我建议允许它为null,并在顶级调用中将其作为null传递。如果它为null,则您知道自己在一个新词的开头,您可以创建自己的跟踪器,并将其传递到所有后续递归调用中


祝你好运!

很抱歉,它是用Java编写的,非常感谢你指出>=的东西,我完全错过了它。你的权利,只要我修复了最后2条if语句,我就没有越界。但我的主要问题仍然存在(何时何地重置真假),我不理解你关于发送空值的观点,我想坚持正确或错误。在看起来像3或4个圆圈只打印出2个单词后,程序也会停止,因此如果你能帮助将tracker设置为正确或错误,那将是令人惊讶的!