博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
地铁线路图计算--路由计算及设计参考
阅读量:7239 次
发布时间:2019-06-29

本文共 5820 字,大约阅读时间需要 19 分钟。

public class StationSched    {        ///         /// 所有的站点信息        ///         List
stations = new List
(); ///
/// 线路信息 /// List
lines = new List
(); ///
/// 构造函数,初始化站点和线路信息 /// public StationSched() { stations.Add(new StationInfo() { Sid = 1, Lid = 1 });//0 stations.Add(new StationInfo() { Sid = 2, Lid = 1 });//1 stations.Add(new StationInfo() { Sid = 3, Lid = 1 });//2 stations.Add(new StationInfo() { Sid = 4, Lid = 1 });//3 stations.Add(new StationInfo() { Sid = 5, Lid = 1 });//4 stations.Add(new StationInfo() { Sid = 6, Lid = 1 });//5 stations.Add(new StationInfo() { Sid = 7, Lid = 1 });//6 stations.Add(new StationInfo() { Sid = 19, Lid = 2 });//7 stations.Add(new StationInfo() { Sid = 18, Lid = 2 }); stations.Add(new StationInfo() { Sid = 17, Lid = 2 }); stations.Add(new StationInfo() { Sid = 3, Lid = 2 }); stations.Add(new StationInfo() { Sid = 13, Lid = 2 }); stations.Add(new StationInfo() { Sid = 16, Lid = 2 }); stations.Add(new StationInfo() { Sid = 15, Lid = 3 });//13 stations.Add(new StationInfo() { Sid = 14, Lid = 3 }); stations.Add(new StationInfo() { Sid = 13, Lid = 3 }); stations.Add(new StationInfo() { Sid = 12, Lid = 3 }); stations.Add(new StationInfo() { Sid = 11, Lid = 3 }); stations.Add(new StationInfo() { Sid = 5, Lid = 3 }); stations.Add(new StationInfo() { Sid = 10, Lid = 3 }); stations.Add(new StationInfo() { Sid = 9, Lid = 3 }); stations.Add(new StationInfo() { Sid = 8, Lid = 3 }); for (int i = 0; i < 6; i++) { lines.Add(new ShipInfo() { Curr = stations[i], Next = stations[i + 1] }); } for (int i = 6; i > 0; i--) { lines.Add(new ShipInfo() { Curr = stations[i], Next = stations[i - 1] }); } for (int i = 7; i < 12; i++) { lines.Add(new ShipInfo() { Curr = stations[i], Next = stations[i + 1] }); } for (int i = 12; i > 7; i--) { lines.Add(new ShipInfo() { Curr = stations[i], Next = stations[i - 1] }); } for (int i = 13; i < 21; i++) { lines.Add(new ShipInfo() { Curr = stations[i], Next = stations[i + 1] }); } for (int i = 21; i > 13; i--) { lines.Add(new ShipInfo() { Curr = stations[i], Next = stations[i - 1] }); } } ///
/// 获取sid站点可以到达的站点信息,去除已经计算过的preid站点 /// ///
///
///
public List
GetNext(int preid, int sid) { List
list = new List
(); foreach (var item in lines) { if (item.Curr.Sid == sid && item.Next.Sid != preid) list.Add(item.Next); } return list; } ///
/// 获取线路信息 /// ///
起始站点编号 ///
结束站点编号 ///
public List
GetResult(int s, int e) { List
> temp = GetLine(s, e); List
result = new List
(); List
> line = new List
>(); foreach (var item in temp) { if (item.Count > 0 && item[item.Count - 1] == e) line.Add(item); } string src = ""; int currLine = -1; foreach (var item in line) { currLine = GetLineNumber(item[0], item[1]); src += "从[" + currLine + "号线]的[" + item[0] + "]上车"; for (int i = 1; i < item.Count; i++) { if (i == item.Count - 1) { src += ",在[" + item[i] + "]站点下车。"; result.Add(src); src = ""; break; } int tempLine = GetLineNumber(item[i], item[i + 1]); if (tempLine != currLine) { currLine = tempLine; src += ",在[" + item[i] + "]站点换乘[" + currLine + "号线]"; } } } return result; } ///
/// 根据相邻的两个点取当前的线路 /// ///
///
///
private int GetLineNumber(int l, int r) { foreach (var item in lines) { if ((item.Curr.Sid == l && item.Next.Sid == r) || (item.Curr.Sid == r && item.Next.Sid == l)) return item.Next.Lid; } return -1; } ///
/// 获取线路的ID集合 /// ///
起始站点编号 ///
结束站点编号 ///
private List
> GetLine(int s, int e) { List
> result = new List
>(); List
curr = new List
(); curr.Add(s); result.Add(curr); int currLine = 0; int preSid = s; int currSid = s; while (true) { if (currLine >= result.Count) return result; currSid = result[currLine][result[currLine].Count - 1]; if (currSid == e) { currLine += 1; continue; } if (result[currLine].Count > 1) preSid = result[currLine][result[currLine].Count - 2]; if (currSid <= 0) { currLine += 1; continue; } List
temp = GetNext(preSid, currSid); if (temp.Count == 0) { //某条线路到头 currLine += 1; } else if (temp.Count == 1) { //不需要换乘继续前进 result[currLine].Add(temp[0].Sid); } else { //需要换乘了。 for (int i = 1; i < temp.Count; i++) { if (!result[currLine].Contains(temp[i].Sid)) { //防止死循环,过滤掉已经计算过的站点。 result.Add(result[currLine].GetRange(0, result[currLine].Count)); result[result.Count - 1].Add(temp[i].Sid); } } result[currLine].Add(temp[0].Sid); } } } } ///
/// 站点信息 /// public class StationInfo { public int Lid { get; set; } public int Sid { get; set; } public override string ToString() { return "Sid:" + Sid + "--Lid:" + Lid; } } ///
/// 关系信息 /// public class ShipInfo { public StationInfo Curr { get; set; } public StationInfo Next { get; set; } public override string ToString() { return "Curr:" + Curr.Sid + "--Next:" + Next.Sid; } }

调用

       StationSched ss = new StationSched();            List
lines = ss.GetResult(16, 4); for (int i = 0; i < lines.Count; i++) { Console.WriteLine(lines[i]); } Console.ReadLine();

输出结果

 

 

本文转自:http://www.cnblogs.com/danyueweb/p/4174211.html

你可能感兴趣的文章
Python IO多路复用
查看>>
op挂载摄像头
查看>>
json和pickle
查看>>
Mac系统的下载(图文详解)
查看>>
【UESTC 482】Charitable Exchange(优先队列+bfs)
查看>>
通过VS2010的内存分析工具来分析程序性能问题
查看>>
mini-cygwin
查看>>
如何能低成本地快速获取大量目标用户,而不是与竞争对手持久战?
查看>>
三分钟教你同步 Visual Studio Code 设置
查看>>
程序员,你是选择25k的996还是18k的8小时工作日?
查看>>
Socket编程入门(基于Java实现)
查看>>
RX第一章
查看>>
DOM0级和DOM2级事件
查看>>
iOS Client 与WebSocket 通信(二)(转)
查看>>
网易考拉海购Java后台开发实习-面经(已拿offer)
查看>>
React-Router看这里
查看>>
打造一个通用的 RecyclerView Adapter
查看>>
基于redis的秒杀
查看>>
js如何实现上拉加载更多...
查看>>
.Net Core Logger 实现log写入本地文件系统
查看>>