地铁换乘(华为机试样题)

来源:互联网 发布:淘宝修改昵称 编辑:程序博客网 时间:2024/05/17 05:56

题目简介:

描述:已知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


import java.util.*;public class Main{public static void main(String args[]){Scanner cin = new Scanner(System.in);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";String[] stations = station.split(" ");int length = stations.length;int[][] arr = new int[length][length];HashMap<String, Integer> stationMap = new HashMap<String, Integer>();for(int i=0; i<stations.length; i++) {stationMap.put(stations[i], i);}for(int i=0; i<length; i++){for(int j=0; j<length; j++) {if(i == j) {arr[i][j] = 0;} else {arr[i][j] = 1000;}}}for(int i=0; i<length-1; i++) {arr[i][i+1] = 1;arr[i+1][i] = 1;}arr[9][25] = 0;arr[14][31] = 0;arr[25][9] = 0;arr[31][14] = 0;arr[stationMap.get("A18")][stationMap.get("B1")] = 1000;arr[stationMap.get("B1")][stationMap.get("A18")] = 1000;arr[stationMap.get("A1").intValue()][stationMap.get("A18").intValue()] = 1;//Floyed算法求解for(int k=0; k<length; k++){for(int i=0; i<length; i++) {for(int j=0; j<length; j++) {if((arr[i][k] + arr[k][j]) < arr[i][j]) {arr[i][j] =  arr[i][k] + arr[k][j];}}}}while (cin.hasNext()){String state1 = cin.next();String state2 = cin.next();int i = stationMap.get(state1);int j = stationMap.get(state2);System.out.println(arr[i][j] + 1);}}}




0 0