华为上机测试题(地铁换乘-java)
PS:自己写的,自测试OK,供大家参考。
/*
高级题样题:地铁换乘
描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。
编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18
地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15
输入:输入两个不同的站名
输出:输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次
输入样例:A1 A3
输出样例:3
(注意:按照题示,A1 A3结果为3,所以A1 A1结果就应该为1,依此。)
*/
1 import java.util.Scanner; 2 3 public class Station { 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 void main(String[] args) { 20 21 int step = 0; 22 System.out.println("请输入\"始发站\"(空格)\"终到站\"(例如:A1 B4(回车结束)):"); 23 Scanner sc = new Scanner(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 int getMinStep(String x, String y) { 39 40 if(('A' != x.charAt(0))&&('A' != y.charAt(0))) 41 { 42 //在地铁B线路上 43 return min(stepBtoB(x, y), stepT1orT2(x, y)); 44 } 45 else if(('B' != x.charAt(0))&&('B' != y.charAt(0))) 46 { 47 //在地铁A线路上 48 return min(stepAtoA(x, y), stepT1orT2(x, y)); 49 } 50 else 51 { 52 //A到B,或者B到A 53 return stepT1orT2(x, y); 54 } 55 } 56 57 //从T1或者T2站换乘,s1到s2的最短距离 58 private static int stepT1orT2(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 return min(lineT1, lineT2); 68 } 69 70 //到T1的最短距离 71 private static int steptoT1(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 int steptoT2(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 int stepAtoA(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 int stepBtoB(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 return mod(indexS1SB, indexS2SB); 188 } 189 190 private static int min(int a, int b) 191 { 192 return a<b?a:b; 193 } 194 195 private static int getIndexofSA(String str) 196 { 197 for(int index = 0; index < LENSA; index++) 198 { 199 if(str.equals(SA[index])) 200 { 201 return index; 202 } 203 } 204 205 return -1; 206 } 207 208 private static int getIndexofSB(String str) 209 { 210 for(int index = 0; index < LENSB; index++) 211 { 212 if(str.equals(SB[index])) 213 { 214 return index; 215 } 216 } 217 218 return -1; 219 } 220 221 private static int mod(int a, int b) 222 { 223 if(a < b) 224 { 225 return b-a; 226 } 227 else 228 { 229 return a-b; 230 } 231 } 232 }