我正在为我朋友的应用程序制作一个方法,它返回车辆的路线。 例如,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”
无效。我知道它不起作用,因为第一个字符串的第二个字符是单独的,因为它应该是最后一对,所以我应该怎么做这个方法来处理最后一对?
答案 0 :(得分: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;
}
}
}
}
答案 1 :(得分: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;
}
}
}
}