【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
以江苏科技大学长山校区为例。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息.
初始化景点的信息和景点之间的距离
jingdian[0] = new jingdian(0, "三号组团","三号组团是我们学校---"); jingdian[1] = new jingdian(1, "西苑食堂","西苑食堂是我们学校---"); jingdian[2] = new jingdian(2, "明德园","明德园是我们学校---"); jingdian[3] = new jingdian(3, "文体中心","文体中心是我们学校---"); jingdian[4] = new jingdian(4, "西操场","西操场是我们学校---"); jingdian[5] = new jingdian(5, "文理大楼","文理大楼是我们学校---"); jingdian[6] = new jingdian(6, "北苑","北苑是我们学校---"); jingdian[7] = new jingdian(7, "求索园","求索园是我们学校---"); jingdian[8] = new jingdian(8, "东苑食堂","东苑食堂是我们学校---"); jingdian[9] = new jingdian(9, "图书馆","图书馆是我们学校---"); juli[0][1] = 100; juli[0][3] = 200; juli[1][2] = 80; juli[3][4] = 50; juli[2][5] = 110; juli[4][7] = 150; juli[4][8] = 230; juli[5][6] = 80; juli[6][9] = 100; juli[8][9] = 50; juli[7][8] = 90; juli[7][9] = 70;
查询景点相关信息:
System.out.print("输入查询地点的名称: "); String siteIntro = query(scanner.next()); if (siteIntro != null) { System.out.println("该地点的信息:" + siteIntro); } else { System.err.println("输入的地点名称不存在!"); } }
public static String query(String Name) { int index = arr.indexOf(Name); if (index == -1) { return null; } else { return jingdian[index].getIntro(); } }
2.查询最短路径:
private static String dijkstra(int start, int end) { int vertexCount = daoyou.juli.length; boolean[] isInUSet = new boolean[vertexCount];//数组元素默认初始化为false double[] distant = new double[vertexCount]; int[] parent = new int[vertexCount]; for (int i = 0; i < vertexCount; i++) { distant[i] = daoyou.juli[start][i]; parent[i] = start; } isInUSet[start] = true; distant[start] = 0; parent[start] = -1; for (int i = 0; i < vertexCount; i++) { double minCost = Double.POSITIVE_INFINITY; int minIndex = start; for (int j = 0; j < vertexCount; j++) { if (!isInUSet[j]) if (distant[j] < minCost) { minCost = distant[j]; minIndex = j; } } if (minCost < Double.POSITIVE_INFINITY) { isInUSet[minIndex] = true; } else { break; } if (minIndex == end) return printDijkstra(parent, distant, start, end); for (int j = 0; j < vertexCount; j++) {//迭代优化 if (!isInUSet[j] && distant[minIndex] + daoyou.juli[minIndex][j] < distant[j]) { distant[j] = distant[minIndex] + daoyou.juli[minIndex][j]; parent[j] = minIndex; } } } return null; } private static String printDijkstra(int[] parent, double[] distant, int start, int end) { int p = parent[end]; StringBuilder path = new StringBuilder(arr.get(end)); while (p != -1) { path.insert(0, arr.get(p) + "->"); p = parent[p]; } return arr.get(start) + "->" + arr.get(end)+"路径为:" + " [" + path + "]: " +"最短路径为"+ distant[end]; } }