我正在实现某种类似图形的对象,我现在将其描述。
我有以下对象:
节点 - 包含两个双精度(lat,lon)和两个弧(边)。 MeetingPointNode扩展节点 - 包含两个双精度(lat,lon)和八个弧。 Arc - 包含节点列表(某些常规会话点)。 环 - 包含弧列表。 (基本上它看起来像多边形)。
我有以下问题:我需要从一个随机的会员点开始并迭代,直到我回到同一个会员点或我进入死胡同(我只迭代会合点并忽略常规节点)。 以下是我尝试实现该目标的实现:
public void findRing(Node ringHead, Node current, List<Arc> arcs, Ring foundRing) {
if (current == ringHead) {
foundRing = new Ring();
foundRing.setArcs(arcs);
return;
}
for (int i = 0; i < 8; i++) {
Arc currentArc = current.getArcs()[i];
if (currentArc == null) {
return;
}
arcs.add(currentArc);
currentArc.setIsUsed(true);
for (Node n : currentArc.getListOfNodes()) {
if (n.getClass() != MeetingPointNode.class)
continue;
findRing(ringHead, n, arcs, foundRing);
}
if (foundRing == null) {
currentArc.setIsUsed(false);
arcs.remove(current);
}
}
return;
}
我将按以下格式调用该方法:findRing(head, headNext /* the next meetingPoint from head*/, new ArrayList<Arc>(), null);
我很乐意得到任何帮助。
答案 0 :(得分:1)
您可以在访问时使用LinkedHashSet
并存储节点。当您找到第一个副本时,您有一个Ring
。
LinkedHashSet
保留了元素插入集合的顺序,因此您可以轻松导出Ring
路径。
答案 1 :(得分:0)
如果我正确理解算法,你实际上是在使用深度优先搜索,但你想要使用的是广度优先搜索。 bfs示例: http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/Graph/bfs.html