递归求地铁两站间最短路径
来源:互联网 发布:win7部分软件无法安装 编辑:程序博客网 时间:2024/04/28 03:37
long time no bo 了!文明点!此博非彼bo!
记录一个刚刚完成的题目——
根据某市地铁线路图写一个地铁票价计算程序
需求描述:
1.计费规则:最低2元,超过5站以上每站加收 0.5元,换乘重新起算,例如L1先坐4站,换乘L2再坐6站,结果就是2+2.5=5.5元
2.程序启动以后读取输入文件(in.txt),内容格式如:
L2-8,L2-2
X3,L3-8
....
每行表示一次行程,起点站和终点站之间用逗号分 隔,行数不限
4.系统按最短路径方案(尽量少换乘且站数少,假设乘 客换乘一次用的时间相当于坐4个站)规划路线,计算票价,并把路线和票价输出到文件(out.txt),内容格式如:
L2-8,L2-2=2.5:L2-8,L2-7,L2-6,L2-5,L2-4,L2-3,L2-2
X3,L3-8=4:X3,X4,L3-8
....
等号后面的表示票价和路径
地铁线路图如下:共有5条线路,X开头的站点表示 换乘车站
我用的是最笨的方法——遍历。存储这个图时我没用传统的矩阵方法。我设置了一个父类是Station,子类是NormalStation和TransportStation。就是普通车站和换乘车站,换乘车站里有一个保存着与它相邻的所有车站的ArrayList。我没有按照题目要求全做完,只做了寻找两个站之间的所有路径,想求最短路径再作计算然后排序就可以了,数据量不大。
算法很简单就是递归遍历与当前车站临近的所有车站,避免遍历已经访问过的车站。想运行的话先在d盘建立一个out.txt。
package com.question.station;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Stack;public class Main {static Stack<Station> stack = new Stack<Station>();static List<Station> allStations = new ArrayList<Station>();static Station start;static Station end;static void iterator(Station now){System.out.println("now "+now);if( now != null){if(now == end){System.out.println("find a way");FileWriter writer = null;try{writer = new FileWriter("d:/out.txt",true);Iterator<Station> it = stack.iterator();while(it.hasNext()){writer.write(it.next()+" ");}writer.write(end.toString());writer.write("\r\n");}catch (IOException e) { e.printStackTrace(); } finally { try { if(writer != null){ writer.close(); } } catch (IOException e) { e.printStackTrace(); } } return;}//如果当前车站为普通车站if(now.type.equals(StationTypeEnum.Normal)){NormalStation ns = (NormalStation)now;//访问下一站if(!stack.contains(ns.next)){stack.push(now);iterator(ns.next);stack.pop();}//访问前一站else if(!stack.contains(ns.prev)){stack.push(now);iterator(ns.prev);stack.pop();}else{return;}}//如果当前车站为换乘车站else{TransportStation ts = (TransportStation)now;stack.push(now);for(Station s : ts.stations){if(!stack.contains(s)){iterator(s);}}stack.pop();}}}public static void main(String[] args) {//清空文件File f = new File("d:/out.txt");FileWriter fw;try {fw = new FileWriter(f);fw.write("");fw.close();} catch (IOException e) {e.printStackTrace();}InitStations.init(allStations);for(Station s : allStations){if(s.name.equals("X3")){start = s;}}for(Station s : allStations){if(s.name.equals("L3-8")){end = s;}}stack.push(start);if(start.type.equals(StationTypeEnum.Normal)){NormalStation ns = (NormalStation)start;if(ns.next!=null){iterator(ns.next);}if(ns.prev!=null){iterator(ns.prev);}}else{TransportStation ts = (TransportStation)start;for(Station s : ts.stations){iterator(s);}}}}
完整工程文件到这里下载:http://download.csdn.net/detail/songxueyu/7572913
0 0
- 递归求地铁两站间最短路径
- 【C++】递归求数组最短路径
- 华为6地铁最佳路径
- 地铁换乘最短路径
- 地铁网络(分层图-哈密尔顿路径)
- 地铁网络(分层图-哈密尔顿路径)
- 最短路径之地铁换乘
- 华为练习 6 地铁最佳路径
- 地铁换乘-最短路径问题
- 无源最短路径之--地铁换乘
- 地铁
- 二叉树递归的基本操作(求叶子数目、深度、路径汇总)
- POJ 2499 求二叉树结点到根结点的路径长度 递归 二叉树
- 递归求huffman树的叶子结点的加权路径长度wpl
- 递归求阶乘
- 递归求最小公倍数
- 递归求排列问题
- 汇编递归求N!
- Coder Funny Daily
- 浅谈幸福人生
- javascript基础知识复习4-JS中的跨域解决方案和Comet
- Oracle11g客户端连接服务器很慢的一种解决方法
- vim: 如何使粘贴到vim的代码排列整齐?
- 递归求地铁两站间最短路径
- quartz cluser
- 15大C#(asp.net)开发企业网站管理系统和CMS汇总
- EXPORT_SYMBOL的使用
- c#string注意问题
- SDL2.0在mfc窗口中显示yuv的一种方法
- Linux系统信息查看命令
- unity 编译安卓出错
- activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。