版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、目錄一、實驗要求(需求分析)3a. 實驗?zāi)康?b. 實驗內(nèi)容3c程序功能3二、程序分析42.1 存儲結(jié)構(gòu)42.2 關(guān)鍵算法分析4三、程序運行分析81.程序運行流程圖:82.程序運行結(jié)果截圖:9四總結(jié)11五、附錄12一、實驗要求(需求分析)a. 實驗?zāi)康耐ㄟ^實驗,掌握如下內(nèi)容: 進一步掌握指針、模板類、異常處理的使用 掌握隊列的操作的實現(xiàn)方法 學(xué)習(xí)使用隊列解決實際問題的能力 學(xué)習(xí)使用圖的廣度優(yōu)先搜索解決實際問題的能力b. 實驗內(nèi)容利用隊的結(jié)構(gòu)實現(xiàn)迷宮求解問題。迷宮求解問題如下:心理學(xué)家把一只老鼠從一個無頂蓋的大盒子的入口趕進迷宮,迷宮中設(shè)置很多隔壁,對前進方向形成了多處障礙,心理學(xué)家在迷宮的唯一
2、出口放置了一塊奶酪,吸引老鼠在迷宮中尋找通路以到達出口,測試算法的迷宮如下圖所示。c程序功能輸入起始點的坐標,輸出走出迷宮最短路徑的長度。二、程序分析2.1 存儲結(jié)構(gòu) 存儲結(jié)構(gòu): 隊列順序存儲結(jié)構(gòu)示意圖如下: 2.2 關(guān)鍵算法分析核心算法思想:1. 如果采用直接遞歸的方式,用棧很容易實現(xiàn)路徑的輸出,但是這條路徑不一定是最短路徑。為了改進算法,達到輸出最短路徑的目標,采用隊列的實現(xiàn)方式。2. 為查找最短路徑,使用了“圖”中的算法:廣度優(yōu)先搜索。關(guān)鍵算法思想描述和實現(xiàn):關(guān)鍵算法1:為尋求最短路徑,采用廣度優(yōu)先搜索算法,使用隊列實現(xiàn)路徑存儲,隊列中每個元素用結(jié)構(gòu)體存儲系,包含迷宮坐標、隊列中的序號、
3、父節(jié)點的序號,實現(xiàn)了對路徑的記錄。c+實現(xiàn):struct nodeintparent_id;/保存父節(jié)點的位置intnode_id;/當(dāng)前節(jié)點的序號,以便傳遞給孩子節(jié)點int x,y; /當(dāng)前結(jié)點對應(yīng)的坐標q10*10; /每個節(jié)點包含迷宮坐標、隊列中的序號、父節(jié)點的序號,多個節(jié)點形成隊列關(guān)鍵算法2:遍歷每個位置四周的位置,將沒有走過的位置入隊,形成樹形的隊列,通過出隊操作就能找到最短路徑。c+實現(xiàn):bool getnextpos(int *i ,int *j,int count) switch(count) case 1:(*j)+; return 1; /右 case 2:(*i)+; r
4、eturn 1; /下 case 3:(*j)-; return 1; /左 case 4:(*i)-; return 1; /上 default: return 0; void enqueue(int i,int j,int k)qrear.x = i;qrear.y = j;/保存當(dāng)前節(jié)點對應(yīng)的坐標位置qrear.parent_id = k;/保存父節(jié)點的序號qrear.node_id = rear; /保存當(dāng)前節(jié)點序號rear+;關(guān)鍵算法3:廣度優(yōu)先搜索算法的實現(xiàn),找到最短路徑。廣度優(yōu)先算法在此相當(dāng)于樹的層序遍歷,如下圖:在迷宮地圖中,關(guān)鍵算法三通過不斷調(diào)用關(guān)鍵算法二就能將地圖中可以走的
5、位置入隊,形成類似上圖的樹形結(jié)構(gòu),之后廣度搜索到最淺深度即為最短路徑。例如h節(jié)點的坐標就是出口坐標,當(dāng)層序搜索到h時就終止了,入隊工作結(jié)束,不再將i和j入隊。通過關(guān)鍵算法四逆序就能找到最短路徑a-b-c。其實最短路徑不一定只有一條,例如j點也可能是出口坐標,但是當(dāng)搜索到h時就停止了,故此算法只是輸出了所有最短路徑中可能的一條。c+實現(xiàn):void shortestpath_bfs(int i ,int j)int count,m,n,k;enqueue(i,j,-1);map11 = 1;/起點入隊,標記起點已走過while(true)count = 1;dequeue(&i,&j,&k);n
6、= i,m = j; /保存當(dāng)前位置while(getnextpos(&i,&j,count)count+;if(!mapij) enqueue(i,j,k);mapij = 1;if(i = 8 & j = 9) return;/到達終點,(8,9)是默認終點,可以任意修改i = n; j = m;/保證遍歷當(dāng)前坐標的所有相鄰位置關(guān)鍵算法4:使用隊列指針查找父節(jié)點的方式,從隊尾回溯到隊首,標記出最短路徑。隊列的元素示意圖如下:入隊之后的隊列如下圖:563774713 例如從13號節(jié)點可以讀出它在迷宮地圖中的坐標(7,4),通過第三個元素7就能找到第七號節(jié)點,也即其父節(jié)點(5,6),從父節(jié)點又
7、可以同理找到它的父節(jié)點第三號節(jié)點。這樣就能實現(xiàn)逆序找到路徑。c+實現(xiàn):k = rear-1;while(k != -1)i = qk.x;j = qk.y;mapij = 2;k = qk.parent_id;時間復(fù)雜度與空間復(fù)雜度:算法一和二時間復(fù)雜度與空間復(fù)雜度均為o(1)。算法三占用空間為迷宮邊長n的平方,故空間復(fù)雜度為o(n*n)。最多走n*n步,最少走1步,故時間復(fù)雜度為o(n*n/2)。三、程序運行分析1.程序運行流程圖:開始輸出迷宮圖輸入x,y否(x,y)是否合法是廣度優(yōu)先搜索標記最短路徑輸出最短路徑結(jié) 束2.程序運行結(jié)果截圖:測試條件:以實驗題目中給出的迷宮圖進行測試。測試時固
8、定終點位置,選擇不同的起點位置進行測試,測試各個位置下的輸出是否正常。測試結(jié)論:本程序?qū)τ跍y試地圖在不同起始和終止位置輸出都完全正確。四總結(jié)1、在最初嘗試編寫代碼時,采用的是遞歸算法。雖然用棧實現(xiàn)代碼很簡單,只需要向四個方向不斷遞歸即可,但是使用棧并不能保證輸出的路徑是最佳路徑。所以在完成了遞歸算法之后,我開始思索如何能輸出最短路徑。查找大量資料,結(jié)論是用棧很難實現(xiàn),即使要實現(xiàn)也需要不斷比較各種路徑的長短,然后不斷更新最短路徑。偶然發(fā)現(xiàn)迪杰斯特拉算法,后又學(xué)習(xí)廣度優(yōu)先搜索算法,才用隊列才最終使得問題得以解決。2、在將新算法應(yīng)用到迷宮問題過程中,遇到不少困難,反復(fù)琢磨和看書才將其解決。由于順序隊
9、列的出隊入隊操作加上了賦值和標記位置、建立鏈表關(guān)系,實際將一個順序隊列以指針的作用,變成了一棵樹的結(jié)構(gòu),而樹的深度恰好能反映最短路徑。3、從一個小小的迷宮問題,引出了許多知識,這種探索式的學(xué)習(xí)是很有意義的。從迷宮基本的遞歸和回溯到棧的運用和理解,再到隊列的運用,后又到樹與圖以及隊列的綜合運用,將很多知識點串聯(lián)起來了,加深了理解。同時探索式地學(xué)習(xí)迪杰斯特拉算法也收獲頗多。4、改進:本題為了實現(xiàn)代碼的簡便,沒有采用鏈隊結(jié)構(gòu),因而浪費了一定的空間,特別是當(dāng)迷宮的邊長很長的時候,空間復(fù)雜度以o(n*n)增長,程序效率將大大降低,因而如果是計算復(fù)雜的迷宮,可以考慮將本程序的順序隊列稍加修改變?yōu)殒滉?,實現(xiàn)
10、動態(tài)分配內(nèi)存,以節(jié)省空間消耗。5、進一步的思考:此方法只能輸出一條最短路徑,如何能輸出所有最短路徑?初步算法是將同一深度的節(jié)點全部遍歷,如果后續(xù)還有同樣長度的路徑則輸出該路徑,如果沒有則只有一條最短路徑。五、附錄源代碼:/本程序在windows7 、visual studio2008 環(huán)境下調(diào)試運行成功#includeusing namespace std;voidenqueue(int i,int j,int k); /入隊一個節(jié)點voiddequeue(int *i,int *j,int *k); /獲取當(dāng)前節(jié)點的序號和對應(yīng)的迷宮坐標,然后出列boolgetnextpos(int *i ,
11、int *j,int count); /得到下一個鄰接點的位置voidshortestpath_bfs(int i,int j); /廣度優(yōu)先遍歷尋找最短路徑voidshortestpath(); /輸出最短路徑 voidprint(); /輸出迷宮形狀 int map1010 = 1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,1,0,1,1,0,
12、1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1;struct nodeintparent_id;/保存父節(jié)點的位置intnode_id;/當(dāng)前節(jié)點的序號,以便傳遞給孩子節(jié)點int x,y;/當(dāng)前結(jié)點對應(yīng)的坐標q10*10;/每個節(jié)點包含迷宮坐標、隊列中的序號、父節(jié)點的序號,多個節(jié)點形成隊列 int front = 0,rear = 0;/隊列頭指針和尾指針void main()cout程序說明:n1.輸出路徑為最短路徑;n2.默認的出口在最右下角,如有需要可以調(diào)整。nn;cout初始地圖如下:endl; print();inti,j;reinput:cout
13、請輸入起點坐標(x,y): ij;if(mapij) cout不能從該處出發(fā),請重新輸入!endl;goto reinput; shortestpath_bfs(i,j);cout最短路徑之一如下:endl;shortestpath();void enqueue(int i,int j,int k)qrear.x = i;qrear.y = j;/保存當(dāng)前節(jié)點對應(yīng)的坐標位置qrear.parent_id = k;/保存父節(jié)點的序號qrear.node_id = rear; /保存當(dāng)前節(jié)點序號rear+;void dequeue(int *i,int *j,int *k)*i = qfront.
14、x;*j = qfront.y;*k = qfront.node_id;front+;/出列一個節(jié)點bool getnextpos(int *i ,int *j,int count) switch(count) case 1:(*j)+; return 1; /右 case 2:(*i)+; return 1; /下 case 3:(*j)-; return 1; /左 case 4:(*i)-; return 1; /上 default: return 0; void shortestpath_bfs(int i ,int j)int count,m,n,k;enqueue(i,j,-1);
15、map11 = 1;/起點入隊,標記起點已走過while(true)count = 1;dequeue(&i,&j,&k);n = i,m = j; /保存當(dāng)前位置while(getnextpos(&i,&j,count)count+;if(!mapij) enqueue(i,j,k);mapij = 1;if(i = 8 & j = 9) return;/到達終點,(8,9)是默認終點,可以任意修改i = n; j = m;/保證遍歷當(dāng)前坐標的所有相鄰位置void shortestpath()int i,j,k,sum(0) ;k = rear-1;while(k != -1)i = qk.x;j = qk.y;mapij = 2;k = qk.parent_id;cout 0 1 2 3 4 5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025企業(yè)法律風(fēng)險之合同履行過程中應(yīng)注意的事項
- 2025湖南潭邵高速邵陽東互通第合同段施組
- 2025戶外廣告牌出租合同樣本
- 班主任德育工作總結(jié)
- 課題申報參考:孿生數(shù)據(jù)驅(qū)動的退役產(chǎn)品人機協(xié)同拆解動態(tài)優(yōu)化與自適應(yīng)評估研究
- 課題申報參考:聯(lián)合教研提升農(nóng)村中小學(xué)科學(xué)教師跨學(xué)科素養(yǎng)的機制與策略研究
- 自我驅(qū)動學(xué)習(xí)培養(yǎng)學(xué)生自主能力的策略與實踐案例
- 科技在提升個人防護裝備舒適度中的應(yīng)用
- 2024年家畜轉(zhuǎn)基因胚胎項目資金需求報告代可行性研究報告
- 物聯(lián)網(wǎng)時代下嵌入式系統(tǒng)的多層防護策略
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護導(dǎo)體
- 計劃合同部部長述職報告范文
- 人教版高一地理必修一期末試卷
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 二手車車主寄售協(xié)議書范文范本
- 窗簾采購?fù)稑朔桨福夹g(shù)方案)
- 五年級上冊小數(shù)除法豎式計算練習(xí)300題及答案
- 語言規(guī)劃講義
- 生活用房設(shè)施施工方案模板
- 上海市楊浦區(qū)2022屆初三中考二模英語試卷+答案
- GB/T 9755-2001合成樹脂乳液外墻涂料
評論
0/150
提交評論