迭代深度优先搜索查找字符串(2D数组)

时间:2015-07-18 03:47:16

标签: java arrays iteration depth-first-search

我正在尝试为一个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,此方法始终有效。

我有一个有效的递归解决方案,但我想尝试这种方式。关于为什么这不起作用的任何想法?

编辑:代码现在可以从右到左工作,但在尝试向上搜索时仍然无效。

1 个答案:

答案 0 :(得分:0)

我不确切地知道问题是什么,但有一些嫌疑人:

  • 您正在检查其邻居时更新行和列索引。这就像在迭代它时从数组中删除一个元素:它定义得很好,但是有一些棘手的语义。我建议拯救(贪婪的算法)或保持一堆匹配(更深入的搜索,也需要保存一堆被访问的单元格)。

  • for缺少大括号,但是大括号在那里,表示缺少代码。

  • 我不熟悉boggle,但是一封信有没有可能有两个相似的邻居,比如AXA?只需执行output.add(return1DIndex(x, y));,您可能会输出两种方式来获取相同的字母。您最终可能会output长于findMe

我的建议是在你消除错误时遵循更标准的深度优先搜索格式。 Wikipedia具有非递归伪代码实现,例如:https://en.wikipedia.org/wiki/Depth-first_search#Pseudocode