我必须为类似Boggle的游戏编写一个程序,我现在要检查当前一个下面的每个字母,看看他们是否说了一个字。对于像这样的董事会:
W O Y R
F U M F
H T R V
I G S W
唯一可以找到的词是" OUT"从上到下。当它找到一个单词的一部分时,它将该字母放入一个字符串并将其设置为null,这样它就不会在同一个单词中使用两次字母(完整的算法必须能够在多个方向上搜索)。我使用堆栈来跟踪我使用的字母的坐标,这样我就可以回溯,每次弹出堆栈时,我都会取出字符串的最后一个字母并将其放回原来的位置。 。但问题是如果删除多个字母,它会将它们全部放在同一个索引中,覆盖前一个字母。所以在" OUT"更换三个字母后,董事会最终看起来像这样:
W null Y R
F null M F
H O R V
I G S W
我已经完成了我的代码并尝试重写两次,但它总是这样做。你对这种情况发生的原因有任何了解吗?
private void checkNeighbors(LetterCoor center){
String check = out;
while (!path.empty()){
if(center.getDirec()==0){//If the direction to check is down
System.out.println("Bottom");
if((center.getRow())+1<sideLength && board[(center.getRow())+1][center.getCol()]!=null){//makes sure the space below is !null and !out of bounds
check+=board[center.getRow()+1][center.getCol()];
System.out.println("Checking " + check);
if(isValidWord(check)){//checks if string is part of the lexicon
center.nextNeighbor();
board[center.getRow()+1][center.getCol()]=null;
center = new LetterCoor(center.getRow()+1, center.getCol(), 0);
System.out.println("push " + check.substring(check.length()-1));
path.push(center);
out=check;
}
else{
center=(LetterCoor) path.pop();
center.nextNeighbor();
path.push(center);
}
}//end of null if
else{
System.out.println("Null or end of board");
center=(LetterCoor) path.pop();
center.nextNeighbor();
path.push(center);
}
}//end of direc 0 if
else{
System.out.println("pop " + out.substring(out.length()-1,out.length()));
center=(LetterCoor) path.pop();
center.nextNeighbor();
board[center.getRow()][center.getCol()]=out.substring(out.length()-1,out.length());
out=out.substring(0,out.length()-1);
if (center.getDirec()<1){
path.push(center);
}
}
System.out.println("Current string is " + out);
}//end of while loop
}
如果您需要澄清我的代码,请告诉我。
另外,作为澄清,LeterCoor对象存储了三个整数。第一个是字母的行索引,第二个是列索引,第三个是指示搜索的方向(0 =向下,1 =向右,2 =向右等)
答案 0 :(得分:0)
我最终遇到了自己的解决方案。问题出在我的LetterCoor对象上。 Eclipse需要将变量设置为静态,因为我将对象类放在一个单独的文件中,所以当我更新一个LetterCoor对象中的坐标数据时,它会将每个LetterCoor对象的数据设置为该坐标。我通过将对象类移动到与此类相同的文件并从变量中删除静态声明来解决此问题。