已知:
有各种各样的公交车路线,给定起点站点和终点站点,求最少换乘的次数,如果无法到达就返回-1
思路:
首先找到所有包含初始站点的公交车,再找到所有包含结束站点的公交车,将两者送入函数处理,获取最少转乘次数。如果找到转乘次数为1的,则直接返回1,如果找不到,就计算转乘次数为2的情况(假设从公交车a能转乘到b,则返回2)。如果还不行,则计算转乘为3的情况(假设包含七点的公交a能到达bcd,查看bcd中是否有能到包含终点的公交e的),依次类推
public class Solution { /** * @param N: The number of buses * @param route: The route of buses * @param A: Start bus station * @param B: End bus station * @return: Return the minimum transfer number */ public int getMinTransferNumber(int N, int[][] route, int A, int B) { List<Integer> start = new ArrayList<Integer>(); List<Integer> end = new ArrayList<Integer>(); for (int i = 0; i < route.length; i++) { if (contain(route[i], A)) { start.add(i); } if (contain(route[i], B)) { end.add(i); } } int ret = 101; for (int i : start) { for (int j : end) { int temp = calculate(i, j, route); if (temp == -1) { continue; } else { if (temp == 1) { return 1; } if (ret > temp) { ret = temp; } } } } if (ret == 101) { return -1; } return ret; } private int calculate(int i, int j, int[][] route) { if (i == j) { return 1; } List<Integer> list = new ArrayList<Integer>(); list.add(i); int start = 0; int end = 1; for (int ret = 2; ret <= 100; ret++) { for (int itemp = 0; itemp < route.length; itemp++) { if (list.contains(itemp)) { continue; } for (int jtemp = start; jtemp < end; jtemp++) { if (connect(route[itemp], route[list.get(jtemp)])) { list.add(itemp); break; } } } if (list.contains(j)) { return ret; } start = end; end = list.size(); if (start == end) { return -1; } } return -1; } private boolean connect(int[] i, int[] j) { for (int num1 : i) { for (int num2 : j) { if (num1 == num2) { return true; } } } return false; } private boolean contain(int[] route, int site) { for (int i : route) { if (i == site) { return true; } } return false; } }