地铁线路图计算--路由计算及设计参考
2015-05-06 12:17
323 查看
public class StationSched { /// <summary> /// 所有的站点信息 /// </summary> List<StationInfo> stations = new List<StationInfo>(); /// <summary> /// 线路信息 /// </summary> List<ShipInfo> lines = new List<ShipInfo>(); /// <summary> /// 构造函数,初始化站点和线路信息 /// </summary> 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] }); } } /// <summary> /// 获取sid站点可以到达的站点信息,去除已经计算过的preid站点 /// </summary> /// <param name="preid"></param> /// <param name="sid"></param> /// <returns></returns> public List<StationInfo> GetNext(int preid, int sid) { List<StationInfo> list = new List<StationInfo>(); foreach (var item in lines) { if (item.Curr.Sid == sid && item.Next.Sid != preid) list.Add(item.Next); } return list; } /// <summary> /// 获取线路信息 /// </summary> /// <param name="s">起始站点编号</param> /// <param name="e">结束站点编号</param> /// <returns></returns> public List<string> GetResult(int s, int e) { List<List<int>> temp = GetLine(s, e); List<string> result = new List<string>(); List<List<int>> line = new List<List<int>>(); 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; } /// <summary> /// 根据相邻的两个点取当前的线路 /// </summary> /// <param name="s"></param> /// <param name="e"></param> /// <returns></returns> 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; } /// <summary> /// 获取线路的ID集合 /// </summary> /// <param name="s">起始站点编号</param> /// <param name="e">结束站点编号</param> /// <returns></returns> private List<List<int>> GetLine(int s, int e) { List<List<int>> result = new List<List<int>>(); List<int> curr = new List<int>(); 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<StationInfo> 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); } } } } /// <summary> /// 站点信息 /// </summary> public class StationInfo { public int Lid { get; set; } public int Sid { get; set; } public override string ToString() { return "Sid:" + Sid + "--Lid:" + Lid; } } /// <summary> /// 关系信息 /// </summary> 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<string> 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
相关文章推荐
- 地铁线路图的设计与实现
- 地铁线路图的设计与实现
- 地铁线路图的设计与实现
- C语言简单计算器(基于栈和逆波兰表达式)这几天忙着开学的事宜,一直没时间刷提,就把今天刚做好的课程设计——简易计算器贴在这给大家参考!(计算小数时要用0减正数并用括号括起来,这一点不足以后再改进)
- 地铁线路图的设计与实现
- ylbtech-SubwayNav(地铁线路导航)-数据库设计
- 地铁线路图的设计与实现
- 计算地铁换乘--计算出所有的线路
- 针对高分辨率照相手机的LED闪光灯超级电容参考设计
- 装饰性花园,计算不同花园入口的每个入口人数以及所有人数,多线程设计思想,静态域
- iPhone6快速设计参考指南
- Android 组件化 —— 路由设计最佳实践
- 5.HCNP-R&S-IERN——计算OSPF区域内路由
- 云计算(二十八)-【HBase】Rowkey设计
- OSPF协议之"计算路由"
- 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
- Spark RDDs(弹性分布式数据集):为内存中的集群计算设计的容错抽象
- 无线路由脚本分析——计算路由开销
- 转:Java图形化界面设计——布局管理器之FlowLayout(流式布局)其他请参考转载出处网址
- 最舒服的颜色搭配,包含RGB值。作图或设计参考。