地铁线路图计算--路由计算及设计参考

地铁线路图计算--路由计算及设计参考

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

你可能感兴趣的:(设计)