地铁路线程序C语言,个人作业-北京地铁出行路线规划命令行程序完成总结
北京地铁出行路线规划命令行程序 完成总结
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语言,个人作业-北京地铁出行路线规划命令行程序完成总结相关推荐
- 怎么样关闭计算机管理员,电脑怎么样使用命令行程序启用和关闭管理员账户 - 今日爆点...
电脑为什么不能管理员身份运行命令行程序,我们应该怎么样才可以使用管理员身份运行命令行程序.在Windows桌面中按下Windows徽标键+X键,打开超级菜单,选择"以管理员身份运行命令行菜单 ...
- Java命令行程序构建工具airlift使用
package com.ilucky.airlift;import java.util.Arrays;import io.airlift.airline.Cli; import io.airlift. ...
- c语言程序命令行,ttyd(C语言编写的命令行程序) v1.3.1 免费版
ttyd是一个C语言编写的命令行程序,可以把任意命令行程序分享到网页上操作,可以看做是个网页版的远程终端,支持 Linux.macOS 系统,还可以运行在 OpenWrt 之类的嵌入式系统上. 功能特 ...
- Go语言的使用命令行程序
出于如下原因,程序员想创建命令行程序: 1.为创建能够定期自动运行的脚本. 2.为创建与系统中的文件交互的脚本. 3.为创建能够执行系统维护任务的脚本. 4.为避免设计图形用户界面这种无谓的开销. 在 ...
- 基于Golang的CLI 命令行程序开发
基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...
- myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)
1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...
- 手把手教你用delphi 10.2.3 在windows上编译Centos 7下的命令行程序,适合中小学生
手把手教你用delphi 10.2.3 在windows上编译Centos 7下的命令行程序,适合中小学生 1.下载并安装 a)下载:delphicbuilder10_2_3_2631.iso ...
- 结对项目——自动生成小学四则运算题目的命令行程序(基于Python)
这个作业属于课程 软件工程 这个作业的要求在哪里 结对项目 这个作业的目标是 实现一个自动生成小学四则运算题目的命令行程序 成员 3118005408 方俊涛 .3118005409 冯宇航 GitH ...
- (cons '(壹 . 命令行程序界面) 《为自己写本-Guile-书》)
(car <为自己写本-Guile-书>) 前言中,我说要写一个文式编程工具.它的名字叫 zero,是个命令行程序,运行时需要由使用者提供一些参数与文式编程元文档路径.zero 读取元文档 ...
- 命令行程序增加 GUI 外壳
Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 ...
最新文章
- 学习junit和hamcrest的使用
- 牛客网——华为机试(题17:坐标移动)(Java)
- ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)
- 生成JSON数据--Gson(谷歌)方法
- 2018年第九届蓝桥杯C/C++ C组国赛 —— 第二题:最大乘积
- Android之解决远程拍照不打开activity用其它方式获取surfaceView
- jq 方法函数(淡入淡出,查找元素,过滤)遍历
- JQuery + Json 练习随笔
- vim配置之spacevim
- C# Winform控件动态删除
- java guava map_使用googled的guava常见ImmutableMap、Multimap、Sets、Optional、Objects及Preconditions检查等用法...
- linux下面实现执行rm命令,显示do not use rm command
- 简单的文本文件加密小程序
- JQuery入门 初级插件02
- Linux_shell 学习
- Confluence 6 数据库表-杂项(Miscellaneous)
- could not connect to smtp host java_服务器发送邮件出现Could not connect to SMTP host错误 解决办法...
- 计算机网络基础知识题,计算机网络基础知识试题及答案
- Makefile常用模板
- 【供应链架构day10】供应链架构的基础逻辑
热门文章
- java登陆界面_【java中实现登录界面功能】
- javaweb实现即时消息推送功能
- 随记:PNP和NPN三极管区别
- 编译ionic应用时遇到“To run dex in process, the Gradle daemon needs a larger heap.”
- ifconfig 配置ip,netmask,gw
- Windows 常见后缀名
- 阿里云服务器选购之国际版和国内版的平台对比及建议
- 11 Component Composition
- canvas压缩图片方法
- python元组元素的提取_Python元组