我正在寻找正确方向的建议/指导。
我的要求是生成图表而不是解决方案。
我希望实现一种算法来生成只有1个哈密顿周期的图形(NxN网格)。请注意,只有一个独特的解决方案至关重要。该图将是NxN节点网格,每个节点仅具有4个相邻节点,即顶部,右侧,底部,左侧。节点只能访问一次。除此之外,还可以有一些特殊的节点。
一些例子:
@ - means that nodes can be connected with adjacent nodes (top,right,bottom,left)
$ - indicated dead end (no connections with adjacent nodes)
Graph 1 =>
@-@-@
@-$-@
@-@-@
Solution 1 =>
1-2-3
8-$-4
7-6-5
here the solution of the graph is 1->2->3->4->5->6->7->8->1. Notice how the $ node was not included in the final solution.
我采用n * n网格,首先在图上放置随机死节点。在此之后,我放置随机特殊节点。然后,我运行遍历整个网格的dfs搜索,以查看是否满足特殊节点条件的有效循环,并且只访问每个节点一次(起始节点除外)并在起始节点结束,使其成为完整循环。
我在这里要问的是如何确保图表只有1个有效周期。我可以做的一件事是通过在每个周期后添加更多死节点和特殊节点来递归地迭代级别,直到有效哈密顿周期的数量减少到1。这就是我计划实施的目标。
您如何理想地解决此问题?
答案 0 :(得分:0)
首先,我想提一下我还没有找到完整的解决方案。
我要做的是在网格中生成一个循环并存储这个"解决方案",然后在所有遗漏的方格上添加一个死角,这使得生成的循环哈密尔顿。那么我会通过迭代添加"强制边缘来跟随你的approuch"并检查是否存在第二个(阅读:"多于一个")哈密顿循环。
这个检查可以表示为以下问题:&#34;如果你知道一个平面图形包含多个哈密顿循环,你如何检查?&#34;。< / p>
我使用&#34; plane&#34;很容易解释。您的起始网格是平面的,删除节点或强制边缘不会使其成为非平面。这是因为强制边缘A-B可以在A-X-B中变换,其中X是一个新节点,因此需要被任何哈密顿循环访问,这导致强制边缘被访问。
我尝试将一个哈密顿循环转换为另一个哈密顿循环的一种方法如下所示:
如果你采取两个平面哈密顿循环并将它们不匹配的所有边缘,它们形成一个循环(可以多次访问节点)。该循环具有边缘在一个哈密顿循环和另一个哈密顿循环之间交替的特性。我无法找到扭转这一过程的方法。
答案 1 :(得分:0)
为什么不将外部节点连接起来形成一个圆圈,并将所有内部节点标记为&#34;死节点&#34;?
例如,从上面借用你的记号......
3x3 Graph
@@@
@$@
@@@
4x4 Graph
@@@@
@$$@
@$$@
@@@@
5x5图表
@@@@@
@$$$@
@$$$@
@$$$@
@@@@@
总会有一个解决方案,并且生成任意大小的图表都很容易。