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,依此。)
*/

 import java.util.Scanner;

 public class Station {

     static String strA = "A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18";
static String strB = "B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15"; static String[] SA = strA.split(" ");
static String[] SB = strB.split(" "); static int LENSA = SA.length;
static int LENSB = SB.length; static int indexT1SA = getIndexofSA("T1"); //"T1"车站在A线路上的数组下标
static int indexT1SB = getIndexofSB("T1"); //"T1"车站在B线路上的数组下标
static int indexT2SA = getIndexofSA("T2"); //"T2"车站在A线路上的数组下标
static int indexT2SB = getIndexofSB("T2"); //"T2"车站在B线路上的数组下标 public static void main(String[] args) { int step = 0;
System.out.println("请输入\"始发站\"(空格)\"终到站\"(例如:A1 B4(回车结束)):");
Scanner sc = new Scanner(System.in);
String[] strArray = sc.nextLine().split(" "); String x = strArray[0].toUpperCase();
String y = strArray[1].toUpperCase(); System.out.println("go:"+x);
System.out.println("to:"+y); sc.close(); step = getMinStep(x, y) + 1;
System.out.println("经过的最少车站数:"+step);
} private static int getMinStep(String x, String y) { if(('A' != x.charAt(0))&&('A' != y.charAt(0)))
{
//在地铁B线路上
return min(stepBtoB(x, y), stepT1orT2(x, y));
}
else if(('B' != x.charAt(0))&&('B' != y.charAt(0)))
{
//在地铁A线路上
return min(stepAtoA(x, y), stepT1orT2(x, y));
}
else
{
//A到B,或者B到A
return stepT1orT2(x, y);
}
} //从T1或者T2站换乘,s1到s2的最短距离
private static int stepT1orT2(String s1, String s2) {
int lenXtoT1 = steptoT1(s1);
int lenXtoT2 = steptoT2(s1);
int lenYtoT1 = steptoT1(s2);
int lenYtoT2 = steptoT2(s2); int lineT1 = lenXtoT1 + lenYtoT1;
int lineT2 = lenXtoT2 + lenYtoT2; return min(lineT1, lineT2);
} //到T1的最短距离
private static int steptoT1(String s) { if("T1".equals(s))
{
return 0;
}
else if("T2".equals(s))
{
return min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2"));
}
else if('A' == s.charAt(0)) //s是A线路上的车站
{
//找到s站在SA的下标
int indexSSA = getIndexofSA(s); //不换乘,s到T1最短路程
int line1 = min(mod(indexSSA, indexT1SA), LENSA-mod(indexSSA, indexT1SA));
//不换乘,s到T2最短路程
int line2 = min(mod(indexSSA, indexT2SA), LENSA-mod(indexSSA, indexT2SA)); return min(line1, line2+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));
}
else if('B' == s.charAt(0)) //s是B线路上的车站
{
//找到s站在SB的下标
int indexSSB = getIndexofSB(s); //不换乘,s到T1最短路程
int line1 = mod(indexSSB, indexT1SB);
//不换乘,s到T2最短路程
int line2 = mod(indexSSB, indexT2SB); return min(line1, line2+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));
}
else
{
System.out.println("车站名有误,请检查!");
return -1;
}
} //s到T2的最短距离
private static int steptoT2(String s) { if("T2".equals(s))
{
return 0;
}
else if("T1".equals(s))
{
return min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2"));
}
else if('A' == s.charAt(0)) //s是A线路上的车站
{
//找到s站在SA的下标
int indexSSA = getIndexofSA(s); //不换乘,s到T1最短路程
int line1 = min(mod(indexSSA, indexT1SA), LENSA-mod(indexSSA, indexT1SA));
//不换乘,s到T2最短路程
int line2 = min(mod(indexSSA, indexT2SA), LENSA-mod(indexSSA, indexT2SA)); return min(line2, line1+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));
}
else if('B' == s.charAt(0)) //s是B线路上的车站
{
//找到s站在SB的下标
int indexSSB = getIndexofSB(s); //不换乘,s到T1最短路程
int line1 = mod(indexSSB, indexT1SB);
//不换乘,s到T2最短路程
int line2 = mod(indexSSB, indexT2SB); return min(line2, line1+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));
}
else
{
System.out.println("车站名有误,请检查!");
return -1;
}
} //A到A,不换乘
private static int stepAtoA(String s1, String s2) {
if(('B' == s1.charAt(0))||('B' == s2.charAt(0)))
{
System.out.println("输入不是A线路上的站点,请检查!");
return -1;
} //找到s1站,在A线路上的数组下标
int indexS1SA = getIndexofSA(s1); //找到s2站,在A线路上的数组下标
int indexS2SA = getIndexofSA(s2); //不换乘,s1到s2的最短距离
return min(mod(indexS1SA, indexS2SA), LENSA-mod(indexS1SA, indexS2SA));
} //B到B,不换乘
private static int stepBtoB(String s1, String s2) {
if(('A' == s1.charAt(0))||('A' == s2.charAt(0)))
{
System.out.println("输入不是B线路上的站点,请检查!");
return -1;
} //找到s1站,在B线路上的数组下标
int indexS1SB = getIndexofSB(s1); //找到s2站,在B线路上的数组下标
int indexS2SB = getIndexofSB(s2); //不换乘,s1到s2的最短距离
return mod(indexS1SB, indexS2SB);
} private static int min(int a, int b)
{
return a<b?a:b;
} private static int getIndexofSA(String str)
{
for(int index = 0; index < LENSA; index++)
{
if(str.equals(SA[index]))
{
return index;
}
} return -1;
} private static int getIndexofSB(String str)
{
for(int index = 0; index < LENSB; index++)
{
if(str.equals(SB[index]))
{
return index;
}
} return -1;
} private static int mod(int a, int b)
{
if(a < b)
{
return b-a;
}
else
{
return a-b;
}
}
}

华为上机测试题(地铁换乘-java)的更多相关文章

  1. 华为上机测试题(MP3光标移动-java)

    PS:此题满分,可参考 描述: MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲.为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第 ...

  2. 华为上机测试题(数字字符串转二进制-java)

    PS:此题满分,可参考 /*  * 题目:数字字符串转二进制 * 描述: 输入一串整数,将每个整数转换为二进制数,如果倒数第三个Bit是“0”,则输出“0”,如果是“1”,则输出“1”. 题目类别: ...

  3. 华为上机测试题(水仙花数升级版-java)

    PS:这题满分100,没有做对,大家帮忙看看问题在哪 /* * 题目:水仙花数升级版  * 描述: 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1 ...

  4. 华为上机测试题(Excel表格纵列字母数字转换-java)

    PS:这是我刚做的一道题,题目不难,满分60,得分40,大家看看哪里有问题,欢迎提意见,感谢! /* * 题目:Excel表格纵列字母数字转换 * 描述: 在Excel中列的编号为A-Z,AA-AZ, ...

  5. 华为上机测试题(表达式运算-java)

    PS:自己写的,自测试OK,供大家参考. 补充:数据解析的过程,评论区有更好的处理方式,可参考. /* * 输入一个表达式,3*8+7-2,没有括号 输出结果 */ /* 本程序暂不考虑容错处理 */ ...

  6. 华为上机测试题(及格分数线-java)

    PS:自己写的,自测试OK,供大家参考. /* 描述:10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:(1) 及格线是10的倍数:(2) 保证至少有60%的学生及格:(3) 如果所有 ...

  7. 华为上机测试题(求亮灯数量-java)

    PS:自己写的,自测试OK,供大家参考. /* 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.…n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着.有n个学 ...

  8. 华为地铁换乘 Java

    public class MetroTransfor {        static int ver=37;    static int point=35;    static int [][] di ...

  9. 华为上机测试题(大数相乘-java)

    PS:这个不是自己写的,测试OK,供参考. /** * 大数相乘 */ public class BigData { public static void main(String[] args) { ...

随机推荐

  1. Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)

    传送门:https://www.oj.swust.edu.cn/problem/show/2794 来自学长的善意:ZQ的杀龙之旅 Time Limit: 15000 MS Memory Limit: ...

  2. Git-改变历史

    悔棋 在日常的Git操作中,会经常出现这样的状况,输入git commit命令刚刚敲下回车键就后悔了:可能是提交说明中出现了错别字,或者有文件忘记提交,或者有的修改不应该提交,诸如此类. Git提供了 ...

  3. Spring---资源访问工具类

    JDK所提供的访问资源的类并不能很好的满足各种底层资源的访问需求,因此,Spring设计了一个Resource接口,它为应用提供了更强大的访问底层资源的能力 主要方法 boolean exists() ...

  4. Spring_依赖注入思想

    Ioc(Inversion of Control) 控制反转,DI(Dependncy Injection)依赖注入,其实是指同一种思想.举例说明: 张三在某公司负责供水问题.有两种形式,第一种老板指 ...

  5. vlc 编译

    一.有用的网址: https://forum.videolan.org/search.php 二.只编译Java apk部分: source env.shmake distcleanmake -e 编 ...

  6. objc中的类方法和实例方法有什么本质区别和联系

    类方法: 类方法是属于类对象的 类方法只能通过类对象调用 类方法中的self是类对象 类方法可以调用其他的类方法 类方法中不能访问成员变量 类方法中不能直接调用对象方法 类方法是存储在元类对象的方法缓 ...

  7. 《Cracking the Coding Interview》——第14章:Java——题目4

    2014-04-26 19:02 题目:解释下C++里模板和java里泛型的区别? 解法:我很少用java,属于连语法都不过关的程度.所以这个题还真没法详细答,查了些资料以后写了以下几点. 代码: / ...

  8. eclipse里导入maven项目有红叉的解决办法

    导入maven的项目上有红叉,说明eclipse里maven的插件该更新了 1.help里选择install new software 2.点击add,输入name:MavenArchiver, lo ...

  9. 基于vue 2.X和高德地图的vue-amap组件获取经纬度

    今天我就讲了一下怎么通过vue和高德地图开发的vue-amap组件来获取经纬度. 这是vue-amap的官网文档:https://elemefe.github.io/vue-amap/#/ 这是我的码 ...

  10. UVa 11426 - GCD - Extreme (II) 转化+筛法生成欧拉函数表

    <训练指南>p.125 设f[n] = gcd(1, n) + gcd(2, n) + …… + gcd(n - 1, n); 则所求答案为S[n] = f[2]+f[3]+……+f[n] ...