<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了Dijkstra演演算法實現校園導遊程式的具體程式碼,供大家參考,具體內容如下
1.問題描述
校網導遊程式: 一個校園有若干景點,如正校門、人工湖、磁懸浮列車實驗室、櫻花大道、圖書館、體育場體育館和禮堂等。實現一個為來訪客 人提供資訊在詢服務的程式,如查詢景點的詳細資訊,查詢兩個景點之間的一條最短路徑。
2.實驗要求
(1)設計你所在學校的校園平面圖,所含景點不少於10個。
(2)來訪客人可以輸人任一個景點的名稱,查詢景點的詳細資訊。
(3)來訪客人可以輸人任何兩個景點的名稱,查詢這兩個景點之間的一條最短路徑。
3.實現提示
以圖中的頂點表示校園內各景點,存放景點代號、名稱和簡介等資訊;以邊表示路徑,存放路徑長度等相關資訊,如實驗圖10.2所示。本題可採用鄰接方陣或鄰接表實現圖的儲存結構,利用迪傑斯特拉演演算法求得最短路徑。
該程式“見錯就收”、“見好就收”效率比較高——“剪枝”。
import java.util.ArrayList; import java.util.Scanner; public class TourGuide { private static final Site[] sites = new Site[14];//以地點代號循序存放地點 private static final ArrayList<String> arrSites = new ArrayList<>(); private static final double[][] matrix = new double[14][14];//用來存放地點間的路徑長度(對角線為0,不存在為INFINITY) static { sites[0] = new Site(0, "正校門", "正校門...");//初始化存放地點的陣列 sites[1] = new Site(1, "東校門", "東校門..."); sites[2] = new Site(2, "西校門", "西校門..."); sites[3] = new Site(3, "北校門", "北校門..."); sites[4] = new Site(4, "食堂", "食堂..."); sites[5] = new Site(5, "磁懸浮列車實驗室", "磁懸浮列車實驗室..."); sites[6] = new Site(6, "櫻花大道", "櫻花大道..."); sites[7] = new Site(7, "圖書館", "圖書館..."); sites[8] = new Site(8, "體育場", "體育場..."); sites[9] = new Site(9, "體育館", "體育館..."); sites[10] = new Site(10, "游泳館", "游泳館..."); sites[11] = new Site(6, "禮堂", "禮堂..."); sites[12] = new Site(6, "教學樓", "教學樓..."); sites[13] = new Site(6, "宿舍", "宿舍..."); matrix[0][4] = 35;//初始化地點間的路徑長度 matrix[0][11] = 5; matrix[1][10] = 75; matrix[1][13] = 10; matrix[2][4] = 30; matrix[2][7] = 5; matrix[3][6] = 15; matrix[3][7] = 50; matrix[3][9] = 15; matrix[3][10] = 20; matrix[4][8] = 60; matrix[4][11] = 40; matrix[5][8] = 45; matrix[5][11] = 10; matrix[8][11] = 50; matrix[9][10] = 20; matrix[9][13] = 100; matrix[11][12] = 25; matrix[12][13] = 20; for (Site site : sites) arrSites.add(site.getName()); //初始化ArrayList,用於以字串的形式按順序存放地點的名字 for (int i = 0; i < sites.length; i++) {//初始化地點間的路徑長度 for (int j = 0; j < sites.length; j++) { if (i != j && matrix[i][j] == 0) matrix[i][j] = Double.POSITIVE_INFINITY; if (i > j) matrix[i][j] = matrix[j][i]; } } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int select; while (true) { System.out.println("請輸入您想了解的資訊:n1.查詢地點詳細資訊n2.查詢地點間的最短路徑n3.退出系統"); select = scanner.nextInt(); switch (select) { case 1: System.out.print("輸入查詢地點的名稱: "); String siteIntro = query(scanner.next()); if (siteIntro != null) {//其實這裡也可以直接arrSites.indexOf(name)判斷 System.out.println(siteIntro); } else { System.err.println("輸入的地點名稱不存在!"); } break; case 2: System.out.print("輸入所要查詢最短路徑的兩地的名稱(例如:正校門-禮堂): "); String path = findShortestPath(scanner.next()); if (path != null) { System.out.println(path); } else { System.err.println("輸入的所要查詢最短路徑的兩地的名稱或者格式有誤!"); } break; case 3: System.exit(0); default: System.err.println("輸入的選項有誤!"); } System.out.println(); } } public static String query(String siteName) { int index = arrSites.indexOf(siteName); if (index == -1) { return null; } else { return sites[index].getIntro(); } } public static String findShortestPath(String path) { int indexOfSeparator = path.indexOf('-'); if (indexOfSeparator == -1) return null; String start = path.substring(0, indexOfSeparator); String end = path.substring(indexOfSeparator + 1); int indexOfStart = arrSites.indexOf(start); int indexOfEnd = arrSites.indexOf(end); if (indexOfStart == -1 || indexOfEnd == -1) return null; return dijkstra(indexOfStart, indexOfEnd); } private static String dijkstra(int start, int end) { int vertexCount = TourGuide.matrix.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] = TourGuide.matrix[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提高效率 return printDijkstra(parent, distant, start, end); for (int j = 0; j < vertexCount; j++) {//迭代優化 if (!isInUSet[j] && distant[minIndex] + TourGuide.matrix[minIndex][j] < distant[j]) { distant[j] = distant[minIndex] + TourGuide.matrix[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(arrSites.get(end)); while (p != -1) { path.insert(0, arrSites.get(p) + "->"); p = parent[p]; } return arrSites.get(start) + "->" + arrSites.get(end) + " [" + path + "]: " + distant[end]; } } class Site { private int code; private String name; private String intro; public Site(int code, String name, String intro) { this.code = code; this.name = name; this.intro = intro; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIntro() { return intro; } public void setIntro(String intro) { this.intro = intro; } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45