地铁换乘 java_华为上机测试题(地铁换乘-java)

这是一个使用Java实现的地铁换乘问题解决方案,通过计算两个站点之间的最短路径,包括在同一线路内和通过T1、T2换乘的情况。程序首先定义了地铁线路A和B的站点,然后计算从始发站到终点站的最少车站数。
摘要由CSDN通过智能技术生成

1 importjava.util.Scanner;2

3 public classStation {4

5 static String strA = "A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18";6 static String strB = "B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15";7

8 static String[] SA = strA.split(" ");9 static String[] SB = strB.split(" ");10

11 static int LENSA =SA.length;12 static int LENSB =SB.length;13

14 static int indexT1SA = getIndexofSA("T1"); //"T1"车站在A线路上的数组下标

15 static int indexT1SB = getIndexofSB("T1"); //"T1"车站在B线路上的数组下标

16 static int indexT2SA = getIndexofSA("T2"); //"T2"车站在A线路上的数组下标

17 static int indexT2SB = getIndexofSB("T2"); //"T2"车站在B线路上的数组下标

18

19 public static voidmain(String[] args) {20

21 int step = 0;22 System.out.println("请输入\"始发站\"(空格)\"终到站\"(例如:A1 B4(回车结束)):");23 Scanner sc = newScanner(System.in);24 String[] strArray = sc.nextLine().split(" ");25

26 String x = strArray[0].toUpperCase();27 String y = strArray[1].toUpperCase();28

29 System.out.println("go:"+x);30 System.out.println("to:"+y);31

32 sc.close();33

34 step = getMinStep(x, y) + 1;35 System.out.println("经过的最少车站数:"+step);36 }37

38 private static intgetMinStep(String x, String y) {39

40 if(('A' != x.charAt(0))&&('A' != y.charAt(0)))41 {42 //在地铁B线路上

43 returnmin(stepBtoB(x, y), stepT1orT2(x, y));44 }45 else if(('B' != x.charAt(0))&&('B' != y.charAt(0)))46 {47 //在地铁A线路上

48 returnmin(stepAtoA(x, y), stepT1orT2(x, y));49 }50 else

51 {52 //A到B,或者B到A

53 returnstepT1orT2(x, y);54 }55 }56

57 //从T1或者T2站换乘,s1到s2的最短距离

58 private static intstepT1orT2(String s1, String s2) {59 int lenXtoT1 =steptoT1(s1);60 int lenXtoT2 =steptoT2(s1);61 int lenYtoT1 =steptoT1(s2);62 int lenYtoT2 =steptoT2(s2);63

64 int lineT1 = lenXtoT1 +lenYtoT1;65 int lineT2 = lenXtoT2 +lenYtoT2;66

67 returnmin(lineT1, lineT2);68 }69

70 //到T1的最短距离

71 private static intsteptoT1(String s) {72

73 if("T1".equals(s))74 {75 return 0;76 }77 else if("T2".equals(s))78 {79 return min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2"));80 }81 else if('A' == s.charAt(0)) //s是A线路上的车站

82 {83 //找到s站在SA的下标

84 int indexSSA =getIndexofSA(s);85

86 //不换乘,s到T1最短路程

87 int line1 = min(mod(indexSSA, indexT1SA), LENSA-mod(indexSSA, indexT1SA));88 //不换乘,s到T2最短路程

89 int line2 = min(mod(indexSSA, indexT2SA), LENSA-mod(indexSSA, indexT2SA));90

91 return min(line1, line2+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));92 }93 else if('B' == s.charAt(0)) //s是B线路上的车站

94 {95 //找到s站在SB的下标

96 int indexSSB =getIndexofSB(s);97

98 //不换乘,s到T1最短路程

99 int line1 =mod(indexSSB, indexT1SB);100 //不换乘,s到T2最短路程

101 int line2 =mod(indexSSB, indexT2SB);102

103 return min(line1, line2+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));104 }105 else

106 {107 System.out.println("车站名有误,请检查!");108 return -1;109 }110 }111

112 //s到T2的最短距离

113 private static intsteptoT2(String s) {114

115 if("T2".equals(s))116 {117 return 0;118 }119 else if("T1".equals(s))120 {121 return min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2"));122 }123 else if('A' == s.charAt(0)) //s是A线路上的车站

124 {125 //找到s站在SA的下标

126 int indexSSA =getIndexofSA(s);127

128 //不换乘,s到T1最短路程

129 int line1 = min(mod(indexSSA, indexT1SA), LENSA-mod(indexSSA, indexT1SA));130 //不换乘,s到T2最短路程

131 int line2 = min(mod(indexSSA, indexT2SA), LENSA-mod(indexSSA, indexT2SA));132

133 return min(line2, line1+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));134 }135 else if('B' == s.charAt(0)) //s是B线路上的车站

136 {137 //找到s站在SB的下标

138 int indexSSB =getIndexofSB(s);139

140 //不换乘,s到T1最短路程

141 int line1 =mod(indexSSB, indexT1SB);142 //不换乘,s到T2最短路程

143 int line2 =mod(indexSSB, indexT2SB);144

145 return min(line2, line1+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));146 }147 else

148 {149 System.out.println("车站名有误,请检查!");150 return -1;151 }152 }153

154 //A到A,不换乘

155 private static intstepAtoA(String s1, String s2) {156 if(('B' == s1.charAt(0))||('B' == s2.charAt(0)))157 {158 System.out.println("输入不是A线路上的站点,请检查!");159 return -1;160 }161

162 //找到s1站,在A线路上的数组下标

163 int indexS1SA =getIndexofSA(s1);164

165 //找到s2站,在A线路上的数组下标

166 int indexS2SA =getIndexofSA(s2);167

168 //不换乘,s1到s2的最短距离

169 return min(mod(indexS1SA, indexS2SA), LENSA-mod(indexS1SA, indexS2SA));170 }171

172 //B到B,不换乘

173 private static intstepBtoB(String s1, String s2) {174 if(('A' == s1.charAt(0))||('A' == s2.charAt(0)))175 {176 System.out.println("输入不是B线路上的站点,请检查!");177 return -1;178 }179

180 //找到s1站,在B线路上的数组下标

181 int indexS1SB =getIndexofSB(s1);182

183 //找到s2站,在B线路上的数组下标

184 int indexS2SB =getIndexofSB(s2);185

186 //不换乘,s1到s2的最短距离

187 returnmod(indexS1SB, indexS2SB);188 }189

190 private static int min(int a, intb)191 {192 return a

195 private static intgetIndexofSA(String str)196 {197 for(int index = 0; index < LENSA; index++)198 {199 if(str.equals(SA[index]))200 {201 returnindex;202 }203 }204

205 return -1;206 }207

208 private static intgetIndexofSB(String str)209 {210 for(int index = 0; index < LENSB; index++)211 {212 if(str.equals(SB[index]))213 {214 returnindex;215 }216 }217

218 return -1;219 }220

221 private static int mod(int a, intb)222 {223 if(a

228 {229 return a-b;230 }231 }232 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值