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

用DFS算法生成迷宫

施洛城
2023-03-14

下面是DFS算法的伪代码http://www.mazeworks.com/mazegen/mazetut/index.htm

创建一个CellStack(后进先出)来保存单元格位置列表
设置TotalCells=网格中的单元格数
随机选择一个单元格并将其命名为CurrentCell
设置VisitedCells=1

在探访牢房时

别的

从CellStack中弹出最近的单元格条目
使其成为CurrentCell

endIf endWhile

我的闲聊代码

 Maze>>initialize
   |sampleCell width height n sample |

super initialize.
self borderWidth: 0.   
sampleCell := VisibleSquare  new.  
width := sampleCell width.
height := sampleCell  height.
self bounds: (5@5 extent: ((width + n) @ (height + n)) + (2 * self borderWidth)).
visitedcell :=0.
cells := Matrix rows: 8 columns: 7 tabulate: [:i :j |  self newCellAt: i at:j].

这里还有另一种方法。

Maze>>newCellAt:i at:j
  |c|
   celltotal:= 8*7.
[(visitedcell< celltotal)] whileTrue:
["Im stuck with selecting cells next to current cell to make it as
Invisible square" 
"else do this"
c := VisibleSquare new.
origin := self innerBounds origin.
self addMorphBack:  c.
c position: ((i - 1) * c width) @ ((j - 1) * c height) + origin. 
 ^ c 

共有1个答案

柯波峻
2023-03-14

我认为你的问题在于使用row:列:表格:来填充矩阵,因为你没有使用算法中描述的深度优先方法(而且似乎你也在为每个单元格再次循环;我并没有真正遵循它应该做什么:()。从我的POV中,你应该:

  1. initialize方法中填写矩阵,将矩阵的所有方格设置为VisibleSquare的一个新实例(每个实例至少应保持其位置和/或对其邻居的引用,以便以后可以请求单元格的邻居)

HTH

 类似资料:
  • 我正在尝试实现DFS回溯算法,该算法涉及利用维基百科上的堆栈(而不是递归算法)。我试图生成一个由0和1组成的迷宫,其中1代表一堵墙,0代表一条可用路径。对于迷宫中不是墙的任何给定空间,必须始终有一条有效的路径,可以从任何其他非墙单元格到达。 我从一个迷宫开始,它是一个二维大小的迷宫阵列[15][20],然后按照算法将需要标记为已正确访问的单元格标记为已访问。最初,所有单元格(不包括外部边框)都标记

  • 我在一门课上学习序言。我有一个练习,我需要读取一个文件,从中生成一个迷宫,获得从源到目标的路径,然后将其写入一个文件。 我读了文件,对我拥有的每个单元格断言,对连接的每两个单元格断言。 ,,,都是整数坐标,所以我知道起点和终点。 我的工作原理是,如果当前节点连接到目标,完成并返回。否则,找到当前节点所连接的节点,并用新节点调用递归

  • 我是C的新手,我目前正在一个项目中创建一个使用DFS算法生成的迷宫。 我已经成功地生成了一条路径,例如 如上所述, Source是初始单元,1是我根据随机邻居创建的路径,D是“死胡同”。所以,如果可能的话,我想回到S,从另一个方向开始。我该如何处理队列和堆栈?有人能解释一下吗?非常感谢你?

  • 我基于Prim的算法编写了一个迷宫生成器程序: 该算法是Prim算法的随机版本。 从满是墙的网格开始 (来自维基百科) 我已经理解了算法,我只是停留在这一部分:“知道相邻单元是否构成迷宫的一部分”(这意味着,首先获取相邻单元),因为这些单元实际上是树的节点(迷宫,一个二维单元阵列),而墙是这些节点之间的边,我认为有必要用一对点(x,y)来识别每面墙。我如何知道两个电池是否由一堵墙连接?(请记住,每

  • 我在用递归解迷宫。我的矩阵是这样的 这是更大矩阵的原型。我的求解递归方法如下所示 你们可以注意到,这里我返回一个布尔值,如果我找到一条路径,它应该会给我一个真值。但它总是给我错误的答案。我不确定我在递归方法中犯的逻辑错误。方法如下 endX=3;endY=10;

  • 我正在尝试生成完整的路径列表,而不是优化的。使用下面的示例可以更好地解释。 上面代码创建了一个带有边的图和和 我想要的只是从中提取所有路径。 我试过: 我想要的只是: 是否有任何来自的预先存在的方法可以使用?如果没有,有什么方法可以编写一个最优的方法来完成这项工作? 注意:我的问题仅限于给出的例子。再也不可能有拐角案件了。 注2:为简化起见,生成数据。在我的例子中,edges列表来自数据集。假设给