地鐵測試線路圖
源碼
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();
輸出結果