北京地铁出行路线规划命令行程序 完成总结

GitHub:https://github.com/shysimon/my_subway

项目具体功能、使用方法以及算法思想,见上一篇博客:https://www.cnblogs.com/shysimon/p/11559850.html

各模块功能介绍

cn.edu.zucc.shy.model.Line:地铁线路类

cn.edu.zucc.shy.model.Station:地铁站类

cn.edu.zucc.shy.model.Edge:存储地铁站相邻地铁站的编号及所属线路

cn.edu.zucc.shy.model.NowAt:存储当前状态信息,在dijkstra算法中作为优先队列存储的数据结构单元

cn.edu.zucc.shy.manager.FindWay:存储地铁地图信息,查询后直接输出到输出流(文件或控制台,参数决定)

FindWay map = newFindWay(filepath);//输入文件路径,初始化寻路类

map.outWay(start, end, output);//输入起始站,目的站,输出流,直接在输出流输出找到的路

map.outLineInf(linename ,output);//输入线路名称,输出流,直接在输出流输出该线路

cn.edu.zucc.shy.manager.TxtLineReader:读取一行文件作为一条地铁线

ArrayList lines =TxtLineReader.read(filepath);//输入文件路径 将地铁线路文件转换成 地铁线路表

cn.edu.zucc.shy.manager.ArgsReader:处理程序输入参数以及异常处理

Pair> in =ArgsReader.argsReader(args);//输入命令行参数,返回处理之后的数据,并提供异常处理

cn.edu.zucc.shy.Main: 根据manager.ArgsReader返回的参数,使用manager.FindWay中对应的方法

subway:程序的入口,直接调用Main

寻路算法的具体实现

数据在程序运行过程中的存储

地铁线路信息文件为本程序的必备参数,读取 subway.txt 文件后调用 FindWay 的带参构造函数

使用 ArrayList lines 存储地铁线路,每条线路也是使用 ArrayList;

使用 ArrayList>>> stations 存储所有站点的名字以及所有位置,使得每一个站点有且只有一个下标;

使用 Map mpLine 存储地铁线路对应地铁线路在 lines 中的下标;

使用 Map mpStation 存储地铁站名对应地铁站在 stations 中的下标;

for (int i = 0; i < lines.size(); i++) {

mpLine.put(lines.get(i).getName(), i);for (int j = 0; j < lines.get(i).getStations().size(); j++) {

String stationName=lines.get(i).getStations().get(j).getName();if (mpStation.get(stationName) == null) {

Vector> p = new Vector<>();

p.add(new Pair<>(i, j));

stations.add(new Pair<>(stationName, p));

mpStation.put(stationName, stations.size()- 1);

}else{

stations.get(mpStation.get(stationName)).getValue().add(new Pair<>(i, j));

}

}

}

使用 ArrayList> 存储地铁线路的邻接表。

for (int i = 0; i < lines.size(); i++) {int u = mpStation.get(lines.get(i).getStations().get(0).getName());for (int j = 1; j < lines.get(i).getStations().size(); j++) {int v =mpStation.get(lines.get(i).getStations().get(j).getName());

edges.get(u).add(newEdge(v, i));

edges.get(v).add(newEdge(u, i));

u=v;

}

}

输出对应地铁线路的所有站点信息

直接在 mpLine 找到对应的线路的下标,在lines中找到输出

寻找最短路的过程

先在 mpStation 中找到对应起点、终点的下标,在 stations 找到所有可能的初始状态(换成站可以选择多条线路),对于每一种初始状态,都跑一遍最短路,输出在长度最短的情况下换乘最少的情况。

输出路径以及换乘线路信息的方法是,使用优先队列优化的 dijkstra 算法中,每次进入新的节点,就将进入时的状态保存在当前站点下标位置的数组中,保存的状态包括前一个站点的下标,当前所在的线路下标。这样,在找到最短路之后,从终点反着找回去,即可得到完整最短路,以及换成线路的信息。

关键代码:

r= newStringBuilder();int now = en, line =path[now].atLine;while (now != -1) {

r.insert(0, " " +stations.get(now).getKey());

now=path[now].from;if (now == -1 || path[now].atLine !=line) {int oldLine =line;if (now != -1) {

r.insert(0, " " +stations.get(now).getKey());

line=path[now].atLine;

}

r.insert(0, "\n");

}

}

output.write("从 "+start+" 到 "+end+" 共经过" + (minChange + 1) + "条线路," + (minLength + 1) + "个站点" +r);

输出效果如下:

从 苹果园 到 德茂 共经过6条线路,25个站点<1号线>苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆<9号线>军事博物馆 北京西站<7号线>北京西站 湾子 达官营 广安门内 菜市口<4号线>菜市口 陶然亭 北京南站<14号线东段>北京南站 永定门外<8号线南段> 永定门外 木樨园 海户屯 大红门南 和义 东高地 火箭万源 五福堂 德茂

地铁路线程序C语言,个人作业-北京地铁出行路线规划命令行程序完成总结相关推荐

  1. 怎么样关闭计算机管理员,电脑怎么样使用命令行程序启用和关闭管理员账户 - 今日爆点...

    电脑为什么不能管理员身份运行命令行程序,我们应该怎么样才可以使用管理员身份运行命令行程序.在Windows桌面中按下Windows徽标键+X键,打开超级菜单,选择"以管理员身份运行命令行菜单 ...

  2. Java命令行程序构建工具airlift使用

    package com.ilucky.airlift;import java.util.Arrays;import io.airlift.airline.Cli; import io.airlift. ...

  3. c语言程序命令行,ttyd(C语言编写的命令行程序) v1.3.1 免费版

    ttyd是一个C语言编写的命令行程序,可以把任意命令行程序分享到网页上操作,可以看做是个网页版的远程终端,支持 Linux.macOS 系统,还可以运行在 OpenWrt 之类的嵌入式系统上. 功能特 ...

  4. Go语言的使用命令行程序

    出于如下原因,程序员想创建命令行程序: 1.为创建能够定期自动运行的脚本. 2.为创建与系统中的文件交互的脚本. 3.为创建能够执行系统维护任务的脚本. 4.为避免设计图形用户界面这种无谓的开销. 在 ...

  5. 基于Golang的CLI 命令行程序开发

    基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...

  6. myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)

    1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...

  7. 手把手教你用delphi 10.2.3 在windows上编译Centos 7下的命令行程序,适合中小学生

    手把手教你用delphi 10.2.3 在windows上编译Centos 7下的命令行程序,适合中小学生 1.下载并安装     a)下载:delphicbuilder10_2_3_2631.iso ...

  8. 结对项目——自动生成小学四则运算题目的命令行程序(基于Python)

    这个作业属于课程 软件工程 这个作业的要求在哪里 结对项目 这个作业的目标是 实现一个自动生成小学四则运算题目的命令行程序 成员 3118005408 方俊涛 .3118005409 冯宇航 GitH ...

  9. (cons '(壹 . 命令行程序界面) 《为自己写本-Guile-书》)

    (car <为自己写本-Guile-书>) 前言中,我说要写一个文式编程工具.它的名字叫 zero,是个命令行程序,运行时需要由使用者提供一些参数与文式编程元文档路径.zero 读取元文档 ...

  10. 命令行程序增加 GUI 外壳

    Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 ...

最新文章

  1. 学习junit和hamcrest的使用
  2. 牛客网——华为机试(题17:坐标移动)(Java)
  3. ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)
  4. 生成JSON数据--Gson(谷歌)方法
  5. 2018年第九届蓝桥杯C/C++ C组国赛 —— 第二题:最大乘积
  6. Android之解决远程拍照不打开activity用其它方式获取surfaceView
  7. jq 方法函数(淡入淡出,查找元素,过滤)遍历
  8. JQuery + Json 练习随笔
  9. vim配置之spacevim
  10. C# Winform控件动态删除
  11. java guava map_使用googled的guava常见ImmutableMap、Multimap、Sets、Optional、Objects及Preconditions检查等用法...
  12. linux下面实现执行rm命令,显示do not use rm command
  13. 简单的文本文件加密小程序
  14. JQuery入门 初级插件02
  15. Linux_shell 学习
  16. Confluence 6 数据库表-杂项(Miscellaneous)
  17. could not connect to smtp host java_服务器发送邮件出现Could not connect to SMTP host错误 解决办法...
  18. 计算机网络基础知识题,计算机网络基础知识试题及答案
  19. Makefile常用模板
  20. 【供应链架构day10】供应链架构的基础逻辑

热门文章

  1. java登陆界面_【java中实现登录界面功能】
  2. javaweb实现即时消息推送功能
  3. 随记:PNP和NPN三极管区别
  4. 编译ionic应用时遇到“To run dex in process, the Gradle daemon needs a larger heap.”
  5. ifconfig 配置ip,netmask,gw
  6. Windows 常见后缀名
  7. 阿里云服务器选购之国际版和国内版的平台对比及建议
  8. 11 Component Composition
  9. canvas压缩图片方法
  10. python元组元素的提取_Python元组