这是Boggle解算器的一部分。我做了一个遍历字符串矩阵的递归方法。MyLetteres
存储了所有字符(例如a、b、c…),MyLetteres1
初始化为空,tracker
为false
。这些变量标记了我已经访问过矩阵中的哪些坐标(我无法重新访问坐标)。我只能移动到相邻的坐标(不能跳过)。参数String word
用一个字母(起始点)初始化。int x
和int y
是我的(x。忽略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".
}
您可以做很多事情来帮助我们或您自己。最重要的是,如果你要出界,你应该知道它发生在哪条线上。你的调试器可以告诉你这一点,告诉我们这将有很大帮助。它还可以告诉我们你用什么语言编码。对我来说,它看起来像Java。
在这种情况下,在最后两个if
语句中,您向getPaths传递了错误的x
和y
值。你有
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
和y + 1 < MyLetteres.length
在技术上是不准确的,因为这意味着"x+1比板的‘高度’小"one_answers"y+1比委员会的‘高度"小"。由于你的电路板是正方形的,所以它还可以,但准确地说,你应该有x + 1 < MyLetteres[0].length
,也就是说"比电路板的‘宽度’小x+1"。
最后,关于重置跟踪器,我建议允许它为null,并在顶级调用中将其作为null传递。如果它为null,则表示您正处于一个新词的开头,您可以创建自己的单词并将其传递给所有后续的递归调用。
祝你好运!