递归边缘搜索

时间:2014-02-04 09:35:17

标签: c# algorithm recursion

我正在尝试编写一个算法,该算法将获取沿边缘访问的点列表,以及构成对象其余部分并搜索其中的未访问边缘列表(由点对组成)完成边缘的路径(即,将开始连接到结尾)。我目前有:

public static int PolygonSearch(Point start, Point end, List<Point> visitedPoints, List<Point[]> unvisitedEdges)
{
    int count = 0;
    for (int i = unvisitedEdges.Count - 1; i > -1; i--)
    {
        Point[] line = unvisitedEdges[i];
        if (((Equal(line[0], start) && Equal(line[1], end)) 
            || (Equal(line[1], start) && Equal(line[0], end))) 
            && visitedPoints.Count > 2)
        {
            return count + 1;
        }
        else if (Equal(start, line[0]))
        {
            unvisitedEdges.RemoveAt(i);
            count += PolygonSearch(line[1], end, visitedPoints, unvisitedEdges);
        }
        else if (Equal(start, line[1]))
        {
            unvisitedEdges.RemoveAt(i);
            count += PolygonSearch(line[0], end, visitedPoints, unvisitedEdges);
        }
    }
    return count;
}

(开始和结束是该行的当前起点和终点)

这里显而易见的问题是删除,这会弄乱外部循环,但我不确定如何纠正它,我尝试每次都创建一个新列表但是没有用(我甚至没有实现了一种返回路径的方法,只计算有效的路径。)

任何帮助解决这个问题都将非常感激。

1 个答案:

答案 0 :(得分:1)

为避免删除对象,您可以将其设置为“已删除”,如果已设置,则将其忽略。

以下使用名为Visited的标志。如果“已删除”,则Visited设置为true。

我没有对此进行过明显的测试,但是它应该让你大致了解该怎么做:

public struct Edge
{
    public Edge()
    {
        this.Visited = false;
    }

    public Point[] Points;
    public bool Visited;
}

public static int PolygonSearch(Point start, Point end, List<Point> visitedPoints, List<Edge> unvisitedEdges)
{
    int count = 0;
    for (int i = unvisitedEdges.Count - 1; i > -1; i--)
    {
        Edge line = unvisitedEdges[i];
        if (((Equal(line.Points[0], start) && Equal(line.Points[1], end)) 
            || (Equal(line.Points[1], start) && Equal(line.Points[0], end))) 
            && visitedPoints.Count > 2
            && line.Visited == false)
        {
            return count + 1;
        }
        else if (Equal(start, line[0]))
        {
            unvisitedEdges[i].Visited = true;
            count += PolygonSearch(line.Points[1], end, visitedPoints, unvisitedEdges);
        }
        else if (Equal(start, line[0]))
        {
            unvisitedEdges[i].Visited = true;
            count += PolygonSearch(line.Points[1], end, visitedPoints, unvisitedEdges);
        }
    }
    return count;
}