当前位置: 首页 > 知识库问答 >
问题:

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

田嘉慕
2023-03-14

我试图创建一个boggle游戏的迭代方法。该类包含一个名为“Board”的2D字符串数组的字段,并有一个名为“HaveVisit”的2D布尔数组。调用test2的方法遍历整个板,查找目标字符串第一个字符的位置,然后将坐标传递给test2方法,返回一个包含坐标的列表。

return1Index方法获取一个2D数组坐标at,创建一个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个答案

国胤
2023-03-14

我不知道问题到底出在哪里,但有几个疑点:

>

  • 您正在更新行和列索引,同时检查它们的邻居。这就像在遍历数组时从数组中删除一个元素一样:它定义得很好,但语义很棘手。我建议要么省略(贪婪算法),要么保留匹配的堆栈(更深的搜索,也需要保存访问的单元格堆栈)。

    缺少开始大括号,但结束大括号在那里,这表明缺少代码。

    我不熟悉boggle,但是一个字母不可能有两个相似的邻居,比如AXA吗?只需执行output.add(return1DIndex(x,y));,就可以输出两种获取相同字母的方法。您可能会得到output长于findme的结果。

    我的建议是,在排除错误的同时,遵循更标准的深度优先搜索格式。Wikipedia有一个非递归伪代码实现,例如:https://en.Wikipedia.org/wiki/depth-first_search#pseudocode。

  •  类似资料:
    • 主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以

    • 本文向大家介绍深度优先搜索,包括了深度优先搜索的使用技巧和注意事项,需要的朋友参考一下 图遍历是按某种系统顺序访问图的所有顶点的问题。遍历图主要有两种方法。 广度优先搜索 深度优先搜索 深度优先搜索(DFS)算法从顶点v开始,然后遍历到之前未访问过的相邻顶点(例如x),并将其标记为“已访问”,然后继续处理x的相邻顶点,依此类推。 如果在任何一个顶点上遇到所有相邻顶点都被访问过,则它将回溯直到找到具

    • 3. 深度优先搜索 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线

    • 本文向大家介绍什么是深度优先搜索?相关面试题,主要包含被问及什么是深度优先搜索?时的应答技巧和注意事项,需要的朋友参考一下 如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索

    • 深度优先搜索的一般运行时间如下。 dfs 中的循环都在 $$O(V)$$ 中运行,不计入dfsvisit 中发生的情况,因为它们对图中的每个顶点执行一次。 在dfsvisit 中,对当前顶点的邻接表中的每个边执行一次循环。 由于只有当顶点为白色时,dfsvisit 才被递归调用,所以循环对图中的每个边或 $$O(E)$$ 执行最多一次。 因此,深度优先搜索的总时间是 $$O(V + E)$$。

    • 骑士之旅是深度优先搜索的特殊情况,其目的是创建最深的第一棵树,没有任何分支。更一般的深度优先搜索实际上更容易。它的目标是尽可能深的搜索,在图中连接尽可能多的节点,并在必要时创建分支。 甚至可能的是,深度优先搜索将创建多于一个树。当深度优先搜索算法创建一组树时,我们称之为深度优先森林。与广度优先搜索一样,我们的深度优先搜索使用前导链接来构造树。此外,深度优先搜索将在顶点类中使用两个附加的实例变量。新