使用数组进行广度优先搜索

Breadth First Search using array

本文关键字:广度优先搜索 数组      更新时间:2023-10-16

我正在尝试使用数组实现广度优先搜索迷宫。我现在面临的问题是我不能同时展开路径。像这样:

#######
123456#
#3###7#
#4###8#
#5###9G
#######

我现在正在使用的方法是使用for循环来遍历数组。我把起点设为C(当前),终点设为G(目标)。当我在迷宫中迭代时,我搜索存储字符"C"的数组位置。然后我检查了上下左右是否是一堵墙。如果不是,就移到下一个括号。我将新括号设置为'C',前一个括号设置为'O'。

for (int i = 1; i < 12; i++)
    {
        for (int j = 0; j < 12; j++)
        {
            // find current node
            if (maze[i][j] == 'C')
            {
            if (maze[i][j-1] == ' ')       // up
                {
                    maze[i][j-1] = 'C';
                    maze[i][j] = 'O';
                }
                else if (maze[i][j+1] == ' ')       // down
                {
                    maze[i][j+1] = 'C';
                    maze[i][j] = 'O';
                }
                else if (maze[i-1][j] == ' ')       // left
                {
                    maze[i-1][j] = 'C';
                    maze[i][j] = 'O';
                }
                else if (maze[i+1][j] == ' ')
                {
                    maze[i+1][j] = 'C';
                    maze[i][j] = 'O';  
                  }
    }

我如何实现的部分,其中'C'括号是在一个交界处?我用了一个for循环所以它会像这样输出:

#######   #######   #######   #######  #######  #######  #######  #######
C     #   OC    #   OOC   #   OOOC  #  OOOOC #  OOOOOC#  OOOOOO#  OOOOOO#
# ### #   # ### #   #C### #   #C### #  #C### #  #C### #  #O###C#  #O###O#
# ### #   # ### #   # ### #   # ### #  # ### #  # ### #  #C### #  #O###C#
# ###     # ###     # ###     # ###    # ###    # ###    # ###    #C### 
#######   #######   #######   #######  #######  #######  #######  #######

通常,在BFS中不会同时展开路径。相反,您可以将第一个元素放入队列中,然后迭代地从前面取出第一个元素,然后将从该元素可到达且尚未包含在队列中的所有元素添加到队列的后面。

您正在尝试仅在映射上工作;这在BFS中是不可能的。你需要一个包含已访问元素位置的队列,以及一种标记元素已完成的方法。

http://en.wikipedia.org/wiki/Breadth-firstrongearch有一个很好的例子