地铁票价计算程序

根据某市地铁线路图写一个地铁票价计算程序
 
需求描述:

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开头的站点表示 换乘车站

  1 package com.test.test;
  2
  3 import java.util.HashMap;
  4 import java.util.HashSet;
  5 import java.util.Iterator;
  6 import java.util.Map;
  7 import java.util.Set;
  8
  9 public class Test3 {
 10     static Map<Integer,Station> stationMap=new HashMap<Integer,Station>();
 11     public static void main(String[] args) {
 12
 13
 14         Station station1=new Station(1,"1号线第一站",true,false);
 15         Station station2=new Station(1,"1号线第二站",false,false);
 16         station1.setNextStation(station2);
 17         Station station3=new Station(1,"第三站",false,true);
 18         station3.addTransferStations(2);
 19         station2.setNextStation(station3);
 20         Station station4=new Station(1,"1号线第四站",true,false);
 21         station3.setNextStation(station4);
 22
 23
 24         Station station21=new Station(2,"2号线第一站",true,false);
 25         Station station22=new Station(2,"2号线第二站",false,false);
 26         station21.setNextStation(station22);
 27         Station station23=new Station(2,"第三站",false,true);
 28         station23.addTransferStations(1);
 29         station22.setNextStation(station23);
 30         Station station24=new Station(2,"2号线第四站",true,false);
 31         station23.setNextStation(station24);
 32
 33         stationMap.put(1, station1);
 34         stationMap.put(1, station21);
 35
 36         int n=getPosition(station1, "1号线第一站", "1号线第四站", 0);
 37         System.out.println(n);
 38     }
 39
 40     /**
 41      * 计算站点间距离
 42      * @param station
 43      * @param start
 44      * @param end
 45      * @param stationNum 前面已经经过几站
 46      * @return
 47      */
 48     public static int getPosition(Station station,String start,String end,int stationNum){
 49         Iterator<Station> it=station.iterator();
 50         Station startStation=null;
 51         while(it.hasNext()){//找到起始站
 52             Station s=it.next();
 53             if(s.getStationName().equals(start)){
 54                 startStation=s;
 55                 break;
 56             }
 57         }
 58         Station next=startStation.getNextStation();
 59         int num=1;
 60         while(!next.getStationName().equals(end)){
 61             next=next.getNextStation();
 62             if(next==null){
 63                 return -1;//不可达
 64             }
 65             if(next.isTransfer){//如果是换成站
 66                 //循环所以可以换成的路线 递归调用getPosition
 67             }else{//如果不是换成站
 68
 69             }
 70             num++;
 71         }
 72         return stationNum+num;
 73     }
 74
 75     /**
 76      * 站点类
 77      * @author Administrator
 78      *
 79      */
 80     static class Station implements Iterable<Station>{
 81         private int lineNum;//几号线
 82         private String stationName;//站名
 83         private boolean isStartOrEnd;//是否是首站或末站
 84         private boolean isTransfer;//是否是换乘站
 85         private Station nextStation;//該号线的下一站
 86         private Station preStation;//上一站
 87         private Set<Integer> transferStations;//可以换乘那几号线
 88
 89         public Station(int lineNum,String stationName,boolean isStartOrEnd,boolean isTransfer){
 90             this.lineNum=lineNum;
 91             this.stationName=stationName;
 92             this.isStartOrEnd=isStartOrEnd;
 93             this.isTransfer=isTransfer;
 94         }
 95
 96         public int getLineNum() {
 97             return lineNum;
 98         }
 99
100         public void setLineNum(int lineNum) {
101             this.lineNum = lineNum;
102         }
103
104         public String getStationName() {
105             return stationName;
106         }
107
108         public void setStationName(String stationName) {
109             this.stationName = stationName;
110         }
111
112         public boolean isStartOrEnd() {
113             return isStartOrEnd;
114         }
115
116         public void setStartOrEnd(boolean isStartOrEnd) {
117             this.isStartOrEnd = isStartOrEnd;
118         }
119
120         public boolean isTransfer() {
121             return isTransfer;
122         }
123
124         public void setTransfer(boolean isTransfer) {
125             this.isTransfer = isTransfer;
126         }
127
128         public Station getNextStation() {
129             return nextStation;
130         }
131
132         public void setNextStation(Station nextStation) {
133             this.nextStation = nextStation;
134         }
135
136         public Station getPreStation() {
137             return preStation;
138         }
139
140         public void setPreStation(Station preStation) {
141             this.preStation = preStation;
142         }
143
144         public Set<Integer> getTransferStations() {
145             return transferStations;
146         }
147
148         public void addTransferStations(Integer transferStation) {
149             if(transferStations==null){
150                 transferStations=new HashSet<Integer>();
151             }
152             transferStations.add(transferStation);
153         }
154
155
156         @Override
157         public String toString() {
158             return "开始站---> [lineNum=" + lineNum + ", stationName="
159                     + stationName + ", isStartOrEnd=" + isStartOrEnd
160                     + ", isTransfer=" + isTransfer + "]";
161         }
162
163         @Override
164         public Iterator<Station> iterator() {
165             return new  StationIterator(this);
166         }
167
168     }
169
170     static class StationIterator implements Iterator<Station>{
171         private Station station;
172         public StationIterator(Station station){
173             this.station=station;
174         }
175         @Override
176         public boolean hasNext() {
177             return station!=null;
178         }
179
180         @Override
181         public Station next() {
182             Station temp=station;
183             this.station=temp.getNextStation();
184             return temp;
185         }
186
187         @Override
188         public void remove() {
189
190         }
191
192     }
193
194 }
 1 package org.train.test;
 2 import java.util. * ;
 3 public class Main {
 4
 5     public static void main(String args[]) {
 6         Scanner cin = new Scanner(System. in );
 7         String station = "A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18 B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15";
 8         String[] stations = station.split(" ");
 9         int length = stations.length;
10         int[][] arr = new int[length][length];
11         HashMap < String,
12         Integer > stationMap = new HashMap < String,
13         Integer > ();
14         for (int i = 0; i < stations.length; i++) {
15             stationMap.put(stations[i], i);
16         }
17         for (int i = 0; i < length; i++) {
18             for (int j = 0; j < length; j++) {
19                 if (i == j) {
20                     arr[i][j] = 0;
21                 } else {
22                     arr[i][j] = 1000;
23                 }
24             }
25         }
26         for (int i = 0; i < length - 1; i++) {
27             arr[i][i + 1] = 1;
28             arr[i + 1][i] = 1;
29         }
30         arr[9][25] = 0;
31         arr[14][31] = 0;
32         arr[25][9] = 0;
33         arr[31][14] = 0;
34         arr[stationMap.get("A18")][stationMap.get("B1")] = 1000;
35         arr[stationMap.get("B1")][stationMap.get("A18")] = 1000;
36
37         arr[stationMap.get("A1").intValue()][stationMap.get("A18").intValue()] = 1;
38
39         //Floyd算法求解
40         for (int k = 0; k < length; k++) {
41             for (int i = 0; i < length; i++) {
42                 for (int j = 0; j < length; j++) {
43                     if ((arr[i][k] + arr[k][j]) < arr[i][j]) {
44                         arr[i][j] = arr[i][k] + arr[k][j];
45                     }
46                 }
47             }
48         }
49
50         while (cin.hasNext()) {
51             String state1 = cin.next();
52             String state2 = cin.next();
53
54             int i = stationMap.get(state1);
55             int j = stationMap.get(state2);
56
57             System.out.println(arr[i][j] + 1);
58         }
59     }
60
61 }
时间: 2024-10-07 05:26:47

地铁票价计算程序的相关文章

设计模式之策略模式在地铁票价系统中的应用

引言 设计模式是面向对象编程的一个非常精彩的部分.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,它能帮助我们将应用组织成容易了解,容易维护,具有弹性的架构.本文通过一个简单的案例来讲述策略模式在地铁票价系统中的应用. 案例描述 乘客从一个车站乘坐地铁到另一个车站,他/她需要购买一张票.铁路部门对于票价有一些特别的票价规定: 按照市物价主管部门批复的轨道交通网络票价体系,即:轨道交通实行按里程计价的多级票价,0~6公里3元,6公里之后每10公里增加1元;票价计算采用最短路径

团队项目选题——地铁信息查询

项目选题:地铁信息查询 [问题描述] 当今的北京,地铁已经成为绝大多数人出行的首选.截至2014年1月,北京地铁共有17条运营线路.组成覆盖北京市11个市辖区,拥有231座运营车站.总长467千米运营线路的轨道交通系统,工作日均客流约1000万人次,峰值日客运量1155.92万人次.目前,北京地铁票价由原来的2元通票变为浮动票价,具体的票价计算方式见下表: 表 1 地铁票价计算表 里程(公里) 票价(元) 0~6 3 6~12 4 12~22 5 22~32 6 32~52 7 52~72 8

北京郊区房租面临下调压力 平均单位租金36.2元/平

北京郊区房租面临下调压力 平均单位租金36.2元/平 行业动态北青网-北京青年报范辉2014-10-20 04:37 我要分享 2 今年9月北京近郊的平均单位租金为36.2元/平方米 北京郊区房租面临下调压力 中原地产首席分析师张大伟分析认为,地铁公交价格上涨,对房价影响不大,但对于租赁市场的影响较大,特别是对于通州.房山.大兴等远郊区的租赁市场.但从目前北京青年报记者走访中介来看,调价的影响还没有明显影响租赁市场.业内预计,这种对郊区县租赁市场的影响,至少需要在票价调整半年之后,才会有更为直观

中软国际利用大数据融合在智慧轨交和城市感知中的领先实践

大数据在轨道交通应用方面不乏丰富的理论基础.学术探讨和实验性尝试,但对轨交大数据的认知,在业界仍存在多种理解,实际上也缺乏生产级的大数据应用落地案例.在刚刚圆满落幕的"第十四届城市轨道交通(AFC)系统技术应用研讨会"上,中软国际代表受邀在大会上解读了轨道交通领域大数据与价值挖掘的内涵,并结合应用案例,剖析了智慧轨交的落地方法. 大数据的价值来自于数据分析,而在轨交大数据这一概念产生之前,各种数据报表分析等工作都依然存在,也并非是一定要有外部数据的加入才能称之为大数据.不断增加的数据量

2019年,干货神总结,程序员面试技巧

Java相关 Java GC机制(重要程度:★★★★★) 主要从三个方面回答:GC是针对什么对象进行回收(可达性分析法),什么时候开始GC(当新生代满了会进行Minor GC,升到老年代的对象大于老年代剩余空间时会进行Major GC),GC做什么(新生代采用复制算法,老年代采用标记-清除或标记-整理算法),感觉回答这些就差不多了,也可以补充一下可以调优的参数(-XX:newRatio,-Xms,-Xmx等等).如何线程安全的使用HashMap(重要程度:★★★★★) 作为Java程序员还是经常

超级实用!全郑州地铁沿线景点美食全攻略(附首末班时间表)

超级实用!全郑州地铁沿线景点美食全攻略(附首末班时间表) 2017-04-20小金豆郑州微公交 玩得劲 春天在哪里呀? 春天在哪里? 小编总结了 郑州地铁线路景点美食大全 及最新地铁首末班时刻表 最美人间四月天 快跟着小编 坐上地铁去旅行吃美食吧 别忘备上纸巾擦口水啊~ 一 郑州地铁沿线最全景点美食一览 1 1号线 龙子湖站 龙子湖 票价:免费 地址:郑东新区新107国道以东 市体育中心站 中原网球中心 票价:免费 地址:金水区金水东路附近 固始菜家庭餐馆 人均:¥20 地址:金水东路与明理路交

地铁拥挤带来健康问题 头晕烦躁还易交叉感染

通过调查显示, 在2001名被调查者中,align=left> 包括中国在内的很多国家都在想方设法,97. 也不愿走到狭窄的车厢深处.很多人宁愿站在车门口,英国伦敦的地铁承担了全市45%的公交客运量,座位满了,人们就只能侧着身子挤在对面坐着的人的膝盖之间. 地铁里自然拥挤不堪.由于这种“亲密接触”在英国人看来不太“体面”,因此, align=left> 而在日本东京,地铁,更有750万人每天在地铁进出.往往是城市客流量最密集的地方之一.每天就有400多万人在此流动.仅北京, … 在“你所在城市

智慧产物辅治 北京地铁公交涨价

智慧城市机房动力环境监控建 设一直声势浩大,但从概念到落实将近二十年依旧未见太大起色.堵车依旧严重,环境依旧不良,近几年让人头疼的沙尘暴有所减少,但又迎来了 “新客人”雾霾君.一方面限号限行大力提倡公交地铁出行,另一方面公交地铁开始涨价.智慧城市建设落实一缓再缓,地铁公交涨价从提出市面到确定落实用了不 到半年的时间,忆起当年的不涨价说,小编略感压力山大. 发改委已经确定今年12月28日起,结束地铁两元转遍大北京的模式,开启六公里3元起的“高贵”模式.同时,为了缓解公交压力,公交也光荣的同步涨 价

地市级地铁数据管理信息系统解决方案

地市级地铁数据管理信息系统解决方案 一.建设目的 某地市级地铁票卡清分部是地铁整个管理系统的一个重要枢纽,负责联立起线路中心和财务部.市场部等其他多个部门的日常工作,方便客流量统计.收入清分对账以及维护管理分站设备等. 之前,此地市级地铁采用水晶报表进行开发,完成客流和清分结算的业务,由于水晶报表制作复杂功能就要通过编程实现,不好维护管理,所以采用FineReport这款软件辅助开发,FineReport报表软件针对复杂格式的报表数据及Web报表的展现,通过多源分片.不规则分组.双向扩展来轻松拖