这不是真正的迷宫,但这个想法很相似。
我有这个:
问题在于我用红色圈出的地方。我需要一种方法来摆脱不属于其他难题的矩形。
我创建了一个适用于正方形的简单算法:
这种方式的工作原理是2D数组的每个元素都代表一个顶点(图形节点)。每个图节点都有一个连接到的顶点列表。通过从每个顶点到每个连接的绘制线绘制图形。
private void removeDisconnectedSquare(int x, int y)
{
GraphNode topLeft = getNodeAt(x, y);
GraphNode topRight = getNodeAt(x + 1, y);
GraphNode bottomLeft = getNodeAt(x, y + 1);
GraphNode bottomRight = getNodeAt(x + 1, y + 1);
if(topLeft != null &&
topRight != null &&
bottomLeft != null &&
bottomRight != null &&
!hasNodeToLeft(topLeft) && hasNodeToRight(topLeft) &&
!hasNodeAbove(topLeft) && hasNodeBelow(topLeft) &&
hasNodeToLeft(topRight) && !hasNodeToRight(topRight) &&
!hasNodeAbove(topRight) && hasNodeBelow(topRight) &&
!hasNodeToLeft(bottomLeft) && hasNodeToRight(bottomLeft) &&
hasNodeAbove(bottomLeft) && !hasNodeBelow(bottomLeft) &&
hasNodeToLeft(bottomRight) && !hasNodeToRight(bottomRight) &&
hasNodeAbove(bottomRight) && !hasNodeBelow(bottomRight))
{
removeVertex(x, y);
removeVertex(x + 1, y);
removeVertex(x, y + 1);
removeVertex(x + 1, y + 1);
}
}
是否存在一种算法或方法可以检测顶点路径是否不是顶点连接路径的一部分?有时这会产生一条小路。
由于
答案 0 :(得分:0)
我建议找一个好的图库。然后,将每个方块表示为节点,并且如果在它们之间打开直接路径,则在方块之间具有边缘。最后,从“入口节点”开始使用“连接节点”算法(由图库提供)。最后,您可以遍历未通过连接算法标记的所有节点并适当地处理它们。
例如,如果您使用的是C ++,则可以使用Boost Graph Library Connected Components algorithm。其他好的图形库应该有类似的支持。
你也可以滚动你自己的这种算法版本;例如,在堆栈上推送未标记的邻居节点,标记受访节点,然后从堆栈弹出一个节点直到完成。但是,拥有一个好的图形库对于您在此类项目中可能遇到的其他问题非常有用,并且IMO比滚动自己更好。
值得注意的是,您可能会更改迷宫生成算法以始终生成连接图,从而无需在事后清理断开连接的组件。