我正在尝试为一个boggle游戏创建一个迭代方法。该类包含称为“board”的2d字符串数组的字段,并且具有称为“haveVisit”的2d布尔数组。调用测试2的方法遍历整个板,找到目标字符串的第一个字符的位置,然后将坐标传递给test2方法,返回一个保持坐标的列表。
return1Index方法采用2D数组坐标创建一个int,代表来自它的相应1d数组的坐标。 return2DIndex执行相反的操作并返回一个包含两个坐标的int数组。
public List<Integer> test2(int row1, int row2, String findMe){
String temp = findMe;
List<Integer> output = new ArrayList<Integer>();
if (board[row1][row2].charAt(0) != findMe.charAt(0))
return output;
haveVisit = new boolean[size][size];
int row = row1;
int column = row2;
output.add(return1DIndex(row, column));
haveVisit[row][column] = true;
//for each letter in the string
for(int j = 0; j < temp.length(); j++)
//for every column and row combination
for (int x = row - 1; x < row + 2 ; x++)
for (int y = column - 1; y < column + 2 ; y++)
//if index is valid and not visited
if (x > -1 && y > -1 && y < size && x < size && !haveVisit[x][y])
//if the output is the same size as string, return
if(output.size() == findMe.length())
return output;
//if the character in the board matches the char we're looking for
if(board[x][y].charAt(0) == temp.charAt(j))
{
haveVisit[x][y] = true;
output.add(return1DIndex(x, y));
//update row and column indices
row = x;
column = y;
}
}
}
return output;
}
出于某种原因,此方法仅在50%的时间内起作用。该方法在从左到右或从上到下排列时找到字母时工作正常,但是从右到左或从下到上查找单词除了一种情况外永远无效:当您搜索长度为1的字符串时或2,此方法始终有效。
我有一个有效的递归解决方案,但我想尝试这种方式。关于为什么这不起作用的任何想法?
编辑:代码现在可以从右到左工作,但在尝试向上搜索时仍然无效。
答案 0 :(得分:0)
我不确切地知道问题是什么,但有一些嫌疑人:
您正在检查其邻居时更新行和列索引。这就像在迭代它时从数组中删除一个元素:它定义得很好,但是有一些棘手的语义。我建议拯救(贪婪的算法)或保持一堆匹配(更深入的搜索,也需要保存一堆被访问的单元格)。
for
缺少大括号,但是大括号在那里,表示缺少代码。
我不熟悉boggle,但是一封信有没有可能有两个相似的邻居,比如AXA
?只需执行output.add(return1DIndex(x, y));
,您可能会输出两种方式来获取相同的字母。您最终可能会output
长于findMe
。
我的建议是在你消除错误时遵循更标准的深度优先搜索格式。 Wikipedia具有非递归伪代码实现,例如:https://en.wikipedia.org/wiki/Depth-first_search#Pseudocode。