一.任务

查找北京地铁线路最短路径

二.文件存储

1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
2号线 西直门 车公庄 阜成门 复兴门 长椿街 宣武门 和平门 前门 崇文门 北京站 建国门 朝阳门 东四十条 东直门 雍和宫 安定门 鼓楼大街 积水潭
4号线 安河桥北 北宫门 西苑 圆明园 北京大学东门 中关村 海淀黄庄 人民大学 魏公村 国家图书馆 动物园 西直门 新街口 平安里 西四 灵境胡同 西单 宣武门 菜市口 陶然亭 北京南站 马家堡 角门西 公益西桥 新宫 西红门 高米店北 高米店南 枣园 清源路 黄村西大街 黄村火车站 义和庄 生物医药基地 天宫院
5号线 天通苑北 天通苑 天通苑南 立水桥 立水桥南 北苑路北 大屯路东 惠新西街北口 惠新西街南口 和平西桥 和平里北街 雍和宫 北新桥 张自忠路 东四 灯市口 东单 崇文门 磁器口 天坛东门 蒲黄榆 刘家窑 宋家庄
6号线 金安桥 杨庄 西黄村 廖公庄 田村 海淀五路居 慈寿寺 花园桥 白石桥南 车公庄西 车公庄 平安里 北海北 南锣鼓巷 东四 朝阳门 东大桥 呼家楼 金台路 十里堡 青年路 褡裢坡 黄渠 常营 草房 物资学院路 通州北关 北运河西 北运河东 郝家府 东夏园 潞城

  

三.核心算法

用递归的方式,将长的线路用短的线路替代

public void calculate(Station s1,Station s2){
        if(outList.size() == data.totalStaion){
            int flag=0;
            for(Station station : s1.getAllPassedStations(s2)){
                if(!station.getline().equals(line)&&flag==1){
                    line=station.getline();
//                    System.out.print("(请乘坐"+line+")");
                    hh+="(请乘坐"+line+")";
//                    System.out.print("->"+station.getName());
                    hh+="->"+station.getName();
                }
                else if(!station.getline().equals(line)&&flag==0) {
//                    System.out.print(station.getName());
                    hh+=station.getName();
                    flag=1;
                }
                else{
//                    System.out.print("->"+station.getName());
                    hh+="->"+station.getName();
                }
            }
            return ;
        }
        if(!outList.contains(s1)){
            outList.add(s1);
        }
        if(s1.getOrderSetMap().isEmpty()){
            List<Station> Linkedstations = getAllLinkedStations(s1);
            for(Station s : Linkedstations){
                s1.getAllPassedStations(s).add(s);
            }
        }

        Station parent = getShortestPath(s1);
        if(parent == s2){
            for(Station station : s1.getAllPassedStations(s2)){
                if(!station.getline().equals(line)){
                    line=station.getline();
//                  System.out.print("(请乘坐"+line+")");
                  hh+="(请乘坐"+line+")";
//                  System.out.print("->"+station.getName());
                  hh+="->"+station.getName();
                }
                else
//                  System.out.print("->"+station.getName());
                  hh+="->"+station.getName();
            }
            return ;
        }
        for(Station child : getAllLinkedStations(parent)){
            if(outList.contains(child)){
                continue;
            }
            int shortestPath = (s1.getAllPassedStations(parent).size()-1) + 1;
            if(s1.getAllPassedStations(child).contains(child)){
                if((s1.getAllPassedStations(child).size()-1) > shortestPath){
                    s1.getAllPassedStations(child).clear();
                    s1.getAllPassedStations(child).addAll(s1.getAllPassedStations(parent));
                    s1.getAllPassedStations(child).add(child);
                }
            } else {
            	s1.getAllPassedStations(child).addAll(s1.getAllPassedStations(parent));
                s1.getAllPassedStations(child).add(child);
            }
        }
        outList.add(parent);
        calculate(s1,s2);
    }

  

四.测验

不换乘情况下

 需要换乘情况下

 输入异常处理

五.总结

本实验的主要部分就是计算最短路径部分,既需要获得最短线路,又要得到站点,所以我的方法是将所有得到的站点信息存入一个长字符串中,但缺点就是结果不能继续判断是否正确,

而且线路为逐条输入,当线路增加时需要修改代码

github 地址       https://github.com/31701016/-

01-17 21:19