0

以下に示すように、既知のポイントからルートを選択してみたいと思います。しかし、たとえばポイント 2 から 8 までの適切なルート チェーンを取得することはできません。この試行によると、ルート 1-ルート 2 とルート 3 が選択されますが、実際にはルート 1 とルート 3 のみである必要があり、別の例ではポイント 1 からポイント 11 まで、私の試行は結果のすべてのルートを与えます。どうすれば不要なルートをなくすことができるでしょうか。このトライアルで可能でしょうか、それとも見方を変えるべきでしょうか?

static void Main(string[] args)
{
    var route1 = new List<int> { 1, 2, 3, 4 };
    var route2 = new List<int> { 1, 5, 6, 7 };
    var route3 = new List<int> { 1, 8, 9, 10 };
    var route4 = new List<int> { 10, 11, 12, 13 };

    List<List<int>> routeList = new List<List<int>>();
    routeList.Add(route1);
    routeList.Add(route2);
    routeList.Add(route3);
    routeList.Add(route4);

    int start = 3;
    int end = 9;

    var vistedRoutes = new List<List<int>>();

    foreach(var route in routeList.FindAll(r => r.Contains(start)))
    {
        vistedRoutes.Add(route);
        routeList.Remove(route);
        FindPath(vistedRoutes, routeList, start, end);

        if (vistedRoutes.Last().Contains(end))
        {
            break;
        }
    }

    Console.WriteLine("done");
}

static void FindPath(List<List<int>> visitedRoutes, List<List<int>> remainingRoutes, int start, int end)
{
    if (visitedRoutes.Last().Contains(end))
    {
        return;
    }
    for (int i = 0; i < remainingRoutes.Count; i++ )
    {
        var route = remainingRoutes[i];

        foreach (var point in route)
        {
            if (visitedRoutes.Last().Contains(point))
            {
                visitedRoutes.Add(route);
                var newRemainingRoutes = new List<List<int>>(remainingRoutes);
                newRemainingRoutes.Remove(route);
                FindPath(visitedRoutes, newRemainingRoutes, start, end);
                if (visitedRoutes.Last().Contains(end))
                {
                    return;
                }
                else
                {
                    visitedRoutes.Remove(route);
                }
            }
        }
    }
}
4

0 に答える 0