华为上机测试题(地铁换乘-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     public static void main(String[] args) {
 15         
 16         int step = 0;
 17         System.out.println("请输入\"始发站\"(空格)\"终到站\"(例如:A1 B4(回车结束)):");
 18         Scanner sc = new Scanner(System.in);
 19         String[] strArray = sc.nextLine().split(" ");
 20         
 21         String x = strArray[0].toUpperCase();
 22         String y = strArray[1].toUpperCase();
 23         
 24         System.out.println("go:"+x);
 25         System.out.println("to:"+y);
 26         
 27         sc.close();
 28         
 29         step = getMinStep(x, y) + 1;//实际最小步数应该为getMinStep(x, y),此处按题示要求,所以结果加1
 30         System.out.println("经过的最少车站数:"+step);
 31     }
 32 
 33     private static int getMinStep(String x, String y) {
 34         
 35         if((‘A‘ != x.charAt(0))&&(‘A‘ != y.charAt(0)))
 36         {
 37             //在地铁B线路上,不用换乘,已经包含T1到T2
 38             return stepBtoB(x, y);
 39         }
 40         else if((‘B‘ != x.charAt(0))&&(‘B‘ != y.charAt(0)))
 41         {
 42             //在地铁A线路上
 43             return stepAtoA(x, y);
 44         }
 45         else
 46         {
 47             //A到B,或者B到A
 48             return stepT1orT2(x, y);
 49         }
 50     }
 51 
 52     //从T1或者T2站换乘,s1到s2的最短距离
 53     private static int stepT1orT2(String s1, String s2) {
 54         int lenXtoT1 = steptoT1(s1);
 55         int lenXtoT2 = steptoT2(s1);
 56         int lenYtoT1 = steptoT1(s2);
 57         int lenYtoT2 = steptoT2(s2);
 58         
 59         int lineT1 = lenXtoT1 + lenYtoT1;
 60         int lineT2 = lenXtoT2 + lenYtoT2;
 61         
 62         return min(lineT1, lineT2);
 63     }
 64 
 65     //到T1的最短距离
 66     private static int steptoT1(String s) {
 67         
 68         if(‘A‘ == s.charAt(0))
 69         {
 70             //找到s站在SA的下标
 71             int i = getIndexofSA(s);
 72             
 73             //找到"T1"站在SA的下标
 74             int j = getIndexofSA("T1");
 75             
 76             //找到"T2"站在SA的下标
 77             int k = getIndexofSA("T2");
 78             
 79             //不换乘,s到T1最短路程
 80             int line1 = min(mod(i, j), LENSA-mod(i, j));
 81             //不换乘,s到T2最短路程
 82             int line2 = min(mod(i, k), LENSA-mod(i, k));
 83             
 84             return min(line1, line2+stepBtoB("T1", "T2"));
 85         }
 86         else
 87         {
 88             return stepBtoB(s, "T1");
 89         }
 90     }
 91 
 92     //到T2的最短距离
 93     private static int steptoT2(String s) {
 94 
 95         if(‘A‘ == s.charAt(0))
 96         {
 97             //找到s站在SA的下标
 98             int i = getIndexofSA(s);
 99             
100             //找到"T1"站在SA的下标
101             int j = getIndexofSA("T1");
102             
103             //找到"T2"站在SA的下标
104             int k = getIndexofSA("T2");
105             
106             //不换乘,s到T1最短路程
107             int line1 = min(mod(i, j), LENSA-mod(i, j));
108             //不换乘,s到T2最短路程
109             int line2 = min(mod(i, k), LENSA-mod(i, k));
110             
111             return min(line1+stepBtoB("T1", "T2"), line2);
112         }
113         else
114         {
115             return stepBtoB(s, "T2");
116         }
117     }
118 
119     //A到A,有可能会从T1或者T2中转
120     private static int stepAtoA(String s1, String s2) {
121         if((‘B‘ == s1.charAt(0))||(‘B‘ == s2.charAt(0)))
122         {
123             System.out.println("输入不是A线路上的站点,请检查!");
124             return -1;
125         }
126         
127         //找到s1站在SA的下标
128         int i = getIndexofSA(s1);
129         
130         //找到s2站在SA的下标
131         int j = getIndexofSA(s2);
132         
133         //不换乘,s1到s2的最短距离
134         int line1 = min(mod(i, j), LENSA-mod(i, j));
135         
136         //从T1或者T2站换乘,s1到s2的最短距离
137         int line2 = stepT1orT2(s1, s2);
138         
139         return min(line1, line2);
140     }
141 
142     //B到B
143     private static int stepBtoB(String s1, String s2) {
144         if((‘A‘ == s1.charAt(0))||(‘A‘ == s2.charAt(0)))
145         {
146             System.out.println("输入不是B线路上的站点,请检查!");
147             return -1;
148         }
149         
150         //找到s1站在SB的下标
151         int i = getIndexofSB(s1);
152         
153         //找到s2站在SB的下标
154         int j = getIndexofSB(s2);
155         
156         //取两数之模
157         return mod(i, j);
158     }
159     
160     private static int min(int a, int b)
161     {
162         return a<b?a:b;
163     }
164 
165     private static int getIndexofSA(String str)
166     {
167         for(int index = 0; index < LENSA; index++)
168         {
169             if(str.equals(SA[index]))
170             {
171                 return index;
172             }
173         }
174         
175         return -1;
176     }
177 
178     private static int getIndexofSB(String str)
179     {
180         for(int index = 0; index < LENSB; index++)
181         {
182             if(str.equals(SB[index]))
183             {
184                 return index;
185             }
186         }
187         
188         return -1;
189     }
190     
191     private static int mod(int a, int b)
192     {
193         if(a < b)
194         {
195             return b-a;
196         }
197         else
198         {
199             return a-b;
200         }
201     }
202 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。