c#为已知点找到合适的列表链 var route1=新列表{1,2,3}; var route2=新列表{6,7,8}; var route3=新列表{3,7,13}; var route4=新列表{8,9,10};

c#为已知点找到合适的列表链 var route1=新列表{1,2,3}; var route2=新列表{6,7,8}; var route3=新列表{3,7,13}; var route4=新列表{8,9,10};,c#,algorithm,recursion,generic-list,C#,Algorithm,Recursion,Generic List,问题是,;我的原点是2,目标点是9。我的目标是找到合适的路线链。对于这种情况,我的路线是[路线1-路线3-路线2-路线4]。但我不知道如何解决这个问题,我找不到一个算法。答案可以是伪代码或c#implementation 我的方式就是这样;我的起点(2)在路线1中,目标点(9)在路线4中。然后我需要找到连接路由1和路由4的中间路由。我需要算法或技术..给你: var route1 = new List<int> { 1, 2, 3 }; var route2 = new

问题是,;我的原点是2,目标点是9。我的目标是找到合适的路线链。对于这种情况,我的路线是[路线1-路线3-路线2-路线4]。但我不知道如何解决这个问题,我找不到一个算法。答案可以是伪代码或c#implementation

我的方式就是这样;我的起点(2)在路线1中,目标点(9)在路线4中。然后我需要找到连接路由1和路由4的中间路由。我需要算法或技术..

给你:

   var route1 = new List<int> { 1, 2, 3 };
   var route2 = new List<int> { 6, 7, 8 };
   var route3 = new List<int> { 3, 7, 13 };
   var route4 = new List<int> { 8, 9, 10 };
var route1=新列表{1,2,3};
var route2=新列表{6,7,8};
var route3=新列表{3,7,13};
var route4=新列表{8,9,10};
List routeList=新列表();
添加路由列表(路由1);
添加路由列表(路由2);
添加路由列表(路由3);
添加路由列表(路由4);
int起始点=2;
int端点=9;
List finalRouteOrder=新列表();
//找到出发路线。
List currentRoute=routeList.Find(a=>a.Contains(startPoint));
//不再需要列表中的路线。
移除路由列表(currentRoute);
//将其添加到我们的最终路线列表中。
添加(当前路线);
bool done=false;
而(!完成)
{
foreach(当前路由中的int x)
{
currentRoute=routeList.Find(a=>a.Contains(x));
如果(currentRoute!=null)
{
finalRouteOrder.Add(currentRoute);//将此路由添加到最终路由列表中
routeList.Remove(currentRoute);//删除该列表,因为我们已经完成了它。
if(currentRoute.Contains(端点))
{
完成=正确;
}
打破
}
如果(完成)
打破
}
如果(完成)
打破
}
//finalRouteOrder包含按顺序排列的路由。
MessageBox.Show(“完成”);

此代码将查找任意两点之间的路线(如果存在)。路线可能并不总是最短的(例如,从3到13将给出路线1到路线3)。它还使用递归——这似乎是您想要的(基于您的标记)<代码>vistedRoutes包含经过的路线

        var route1 = new List<int> { 1, 2, 3 };
        var route2 = new List<int> { 6, 7, 8 };
        var route3 = new List<int> { 3, 7, 13 };
        var route4 = new List<int> { 8, 9, 10 };

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

        int startPoint = 2;
        int endPoint = 9;


        List<List<int>> finalRouteOrder = new List<List<int>>();

        //  Find starting route.
        List<int> currentRoute = routeList.Find(a => a.Contains(startPoint));

        //  Don't need that route in the list anymore.
        routeList.Remove(currentRoute);

        //  Add it to our final list of routes.
        finalRouteOrder.Add(currentRoute);

        bool done = false;
        while (!done)
        {
            foreach (int x in currentRoute)
            {
                currentRoute = routeList.Find(a => a.Contains(x));
                if (currentRoute != null)
                {
                    finalRouteOrder.Add(currentRoute);  // add this route toi our final list of routes
                    routeList.Remove(currentRoute);  // remove that list since we are done with it.

                    if (currentRoute.Contains(endPoint))
                    {
                        done = true;
                    }
                    break;
                }
                if (done)
                    break;

            }
            if (done)
                break;
        }

        //  finalRouteOrder contains the routes in order.

        MessageBox.Show("Done.");
static void Main(字符串[]args)
{
var route1=新列表{1,2,3};
var route2=新列表{6,7,8};
var route3=新列表{3,7,13};
var route4=新列表{8,9,10};
List routeList=新列表();
添加路由列表(路由1);
添加路由列表(路由2);
添加路由列表(路由3);
添加路由列表(路由4);
int start=3;
int-end=9;
var vistedRoutes=新列表();
foreach(routeList.FindAll(r=>r.Contains(start))中的var路由)
{
vistedRoutes.Add(路线);
路线列表。移除(路线);
FindPath(vistedRoutes、routeList、start、end);
if(vistedRoutes.Last().Contains(end))
{
打破
}
}
控制台。写入线(“完成”);
}
静态void FindPath(列出已访问的路由、列出剩余路由、int start、int end)
{
if(visitedRoutes.Last().Contains(end))
{
返回;
}
对于(int i=0;i
暴力是一种可以使用的算法或技术。你是否总是有4条长度为3的路线?使用谷歌。询问代码的问题必须证明对正在解决的问题的最低理解。包括尝试的解决方案,为什么它们不起作用我不明白你为什么说路线1-路线3-路线2-路线4是从点2到9的正确路径。请详细说明。@user1646737您将使用哪些路线?路线1是唯一一条有“点2”的路线,因此您必须从那里开始。从1号公路只能到3号公路(通过“3号点”)。从3号公路只能前往2号公路(经7号公路)或返回1号公路。从2号公路你可以去4号公路(经8号公路)(其中包含9号公路)或返回3号公路。@Bob2,我不知道。这是模棱两可的。他必须穿越所有4条路线吗?如果不是,我会走1号线(对于2号点),停留在1号线(对于3号点),跳到2号线,因为它是下一个高于3且接近9的数字,然后,直接到4号线,因为3号线以8号点结束。如果你从6号点到9号点怎么办?是的,你是对的。。这就是解决办法。尽管我没有描述,你还是明白了!:)谢谢你,还有@user164673sorry@Bob2Chiv我找不到解决这个问题的方法,如果路线是{1,2,3,4}-{1,5,6,7}-{1,8,9,10}-{10,11,12,13},例如原点是2-目标点8,根据解决方案,将选择1-2-3条路线,但它应该是第一条和第三条路线,这并不总是给出最短路径——因为这是一种贪婪的方法。我相信它可以被调整来做
   static void Main(string[] args)
    {
        var route1 = new List<int> { 1, 2, 3 };
        var route2 = new List<int> { 6, 7, 8 };
        var route3 = new List<int> { 3, 7, 13 };
        var route4 = new List<int> { 8, 9, 10 };

        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);
                    }
                }
            }
        }
    }