0

我正在为我朋友的应用程序创建一个方法,该方法返回车辆的路线。例如,Bus1 有 A-to-B、B-to-C、C-to-D 的路线,最后还有一对,其末端是单独的,就像第一对的 A 一样。

由于每辆车的路线顺序不同,查询返回的结果被打乱了,所以我尝试编写一个方法来对这些组合进行排序以形成路径。像一条链子。我在这里使用字符作为位置和字符串作为路线。

    public void MakePath(ref List<string> routes)
    {
        for (int i = 0; i < routes.Count - 1; i++)
        {
            for (int j = 0; j < routes.Count; j++)
            {
                if (routes[i][1] == routes[j][0])
                {
                    var temp = routes[i + 1];
                    routes[i + 1] = routes[j];
                    routes[j] = temp;
                    j = routes.Count;
                }
            }
        }
    }

它在某些情况下可以正常工作,也就是说,如果最后一对已经在正确的位置。否则它不起作用,例如

"CD" "AB" "BC"

不适用于此。我知道它不起作用,因为第一个字符串的第二个字符是单独的,因为它应该是最后一对,所以我应该在这种方法中做些什么来照顾最后一对?

4

2 回答 2

1

您必须首先扫描列表并找到路线的终点站。在其最简单的形式中,这是路线大小的二次算法。

之后,您可以将路线的终端段放在正确的位置。之后运行你的算法来“熨烫”中间的东西。

public void MakePath(ref List<string> routes)
{
    bool is_first, is_last;
    for (int i = 0; i < routes.Count - 1; i++)
    {
        is_first = true;
        is_last = true;
        for (int j = 0; j < routes.Count; j++)
        {
             if (routes[i][1] == routes[j][0]){
                is_last = false;
                break;
             }
             if (routes[i][0] == routes[j][1]){
                is_start = false;
                break;
             }
        }
        if (is_first) {
             var temp = routes[i];
             routes[i] = routes[0];
             routes[0] = temp;
        }
        if (is_last) {
             var temp = routes[i];
             routes[i] = routes[routes.Count];
             routes[routes.Count] = temp;
        }
     }           
    for (int i = 0; i < routes.Count - 1; i++)
    {
        for (int j = 0; j < routes.Count; j++)
        {
            if (routes[i][1] == routes[j][0])
            {
                var temp = routes[i + 1];
                routes[i + 1] = routes[j];
                routes[j] = temp;
                j = routes.Count;
            }
        }
    }
}
于 2012-05-19T14:33:53.377 回答
0

您只需在运行前对列表进行排序,就可以确保从正确的路线开始:

public void MakePath(ref List<string> routes)
        {
            routes.Sort(); //just insert here
            for (int i = 0; i < routes.Count - 1; i++)
            {
                for (int j = 0; j < routes.Count; j++)
                {
                    if (routes[i][1] == routes[j][0])
                    {
                        var temp = routes[i + 1];
                        routes[i + 1] = routes[j];
                        routes[j] = temp;
                        continue;
                    }
                }
            }
        }
于 2012-05-19T15:07:00.877 回答