




已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
課程設計(論文)題 目 名 稱 迷宮問題 課 程 名 稱 數(shù)據(jù)結(jié)構(gòu)課程設計 學 生 姓 名 學 號 系 、專 業(yè) 信息工程系、電子科學與技術(shù) 指 導 教 師 2011年 12月 13 日目 錄1課程設計內(nèi)容和要求31問題描述32 設計要求33設計的目的32 需求分析4 1 迷宮的建立4 2 迷宮的存儲4 3 迷宮路徑的搜索53 概要設計64 詳細設計75 測試分析106 課程設計總結(jié)11參考文獻12附錄(源程序清單)131課程設計內(nèi)容和要求1問題描述 設計一個簡單迷宮程序,從入口出發(fā),按某一方向向前探索,若能走通(未走過的),即某處可以到達,則到達新點,否則試探下一方向;若所有方向均沒有通路,則沿原點返回前一點,換下一個方向在繼續(xù)試探,直到所有可能的通路都探索到,或找到一條通路,或無路可走又返回到入口點。并利用兩種方法實現(xiàn):一種用棧實現(xiàn),另一種用隊列實現(xiàn)。 2設計要求要求設計程序輸出如下:(1) 建立一個大小為mn的任意迷宮(迷宮數(shù)據(jù)可由用戶輸入或由程序自動生成),并在屏幕上顯示出來;(2)找出一條通路的二元組(i,j)數(shù)據(jù)序列,(i,j)表示通路上某一點的坐標。(3)用一種標志(如數(shù)字8)在迷宮中標出該條通路;(4)在屏幕上輸出迷宮和通路;(5)上述功能可用菜單選擇。3設計的目的僅僅認識到隊列是一種特殊的線性表是遠遠不夠的,本次實習的目的在于使學生深入了解隊列的特征,以便在實際問題背景下靈活運用它,同時還將鞏固這種數(shù)據(jù)結(jié)構(gòu)的構(gòu)造方法2 需求分析 1.迷宮的建立:迷宮中存在通路和障礙,為了方便迷宮的創(chuàng)建,可用0表示通路,用1表示障礙,這樣迷宮就可以用0、1矩陣來描述,2.迷宮的存儲:迷宮是一個矩形區(qū)域,可以使用二維數(shù)組表示迷宮,這樣迷宮的每一個位置都可以用其行列號來唯一指定,但是二維數(shù)組不能動態(tài)定義其大小,我們可以考慮先定義一個較大的二維數(shù)組mazeM+2N+2,然后用它的前m行n列來存放元素,即可得到一個mn的二維數(shù)組,這樣(0,0)表示迷宮入口位置,(m-1,n-1)表示迷宮出口位置。注:其中M,N分別表示迷宮最大行、列數(shù),本程序M、N的缺省值為39、39,當然,用戶也可根據(jù)需要,調(diào)整其大小。3.迷宮路徑的搜索:首先從迷宮的入口開始,如果該位置就是迷宮出口,則已經(jīng)找到了一條路徑,搜索工作結(jié)束。否則搜索其上、下、左、右位置是否是障礙,若不是障礙,就移動到該位置,然后再從該位置開始搜索通往出口的路徑;若是障礙就選擇另一個相鄰的位置,并從它開始搜索路徑。為防止搜索重復出現(xiàn),則將已搜索過的位置標記為2,同時保留搜索痕跡,在考慮進入下一個位置搜索之前,將當前位置保存在一個隊列中,如果所有相鄰的非障礙位置均被搜索過,且未找到通往出口的路徑,則表明不存在從入口到出口的路徑。這實現(xiàn)的是廣度優(yōu)先遍歷的算法,如果找到路徑,則為最短路徑。以矩陣 0 0 1 0 1 為例,來示范一下 1 0 0 1 0 1 0 0 0 10 0 1 0 0搜索算法流程圖如下所示: 首先,將位置(0,0)(序號0)放入隊列中,其前節(jié)點為空,從它開始搜索,其標記變?yōu)?,由于其只有一個非障礙位置,所以接下來移動到(0,1)(序號1),其前節(jié)點序號為0,標記變?yōu)?,然后從(0,1)移動到(1,1)(序號2),放入隊列中,其前節(jié)點序號為1,(1,1)存在(1,2)(序號3)、(2,1)(序號4)兩個可移動位置,其前節(jié)點序號均為2.對于每一個非障礙位置,它的相鄰非障礙節(jié)點均入隊列,且它們的前節(jié)點序號均為該位置的序號,所以如果存在路徑,則從出口處節(jié)點的位置,逆序就可以找到其從出口到入口的通路。如下表所示: 0 1 2 3 4 5 6 7 8 9 10(0,0)(0,1)(1,1)(1,2)(2,1)(2,2)(1,3)(2,3)(0,3)(3,3)(3,4)-10122345679由此可以看出,得到最短路徑:(3,4)(3,3)(2,3)(2,2)(1,2)(1,1)(0,1)(0,0)3 概要設計1 .構(gòu)建一個二維數(shù)組mazeM+2N+2用于存儲迷宮矩陣自動或手動生成迷宮,即為二維數(shù)組mazeM+2N+2賦值構(gòu)建一個隊列用于存儲迷宮路徑建立迷宮節(jié)點struct point,用于存儲迷宮中每個節(jié)點的訪問情況實現(xiàn)搜索算法屏幕上顯示操作菜單2.本程序包含10個函數(shù): (1)主函數(shù) main()(2)手動生成迷宮函數(shù) shoudong_maze()(3)自動生成迷宮函數(shù) zidong_maze()(4)將迷宮打印成圖形 print_maze()(5)打印迷宮路徑 (若存在路徑) result_maze()(6)入隊 enqueue()(7)出隊 dequeue()(8)判斷隊列是否為空 is_empty()(9)訪問節(jié)點 visit()(10)搜索迷宮路徑 mgpath()4 詳細設計實現(xiàn)概要設計中定義的所有數(shù)據(jù)類型及操作的偽代碼算法1. 節(jié)點類型和指針類型迷宮矩陣類型:int mazeM+2N+2;為方便操作使其為全局變量迷宮中節(jié)點類型及隊列類型:struct pointint row,col,predecessor que5122. 迷宮的操作(1)手動生成迷宮void shoudong_maze(int m,int n)定義i,j為循環(huán)變量for(i=m)for(j=n)輸入mazeij的值(2)自動生成迷宮void zidong_maze(int m,int n)定義i,j為循環(huán)變量for(i=m)for(j=n)mazeij=rand()%2 /由于rand()產(chǎn)生的隨機數(shù)是從0到RAND_MAX,RAND_MAX是定義在stdlib.h中的,其值至少為32767),要產(chǎn)生從X到Y(jié)的數(shù),只需要這樣寫:k=rand()%(Y-X+1)+X;(3)打印迷宮圖形void print_maze(int m,int n)用i,j循環(huán)變量,將mazeij輸出 、(4)打印迷宮路徑void result_maze(int m,int n)用i,j循環(huán)變量,將mazeij輸出 、(5)搜索迷宮路徑迷宮中隊列入隊操作void enqueue(struct point p)將p放入隊尾,tail+迷宮中隊列出隊操作struct point dequeue(struct point p)head+,返回quehead-1判斷隊列是否為空int is_empty()返回head=tail的值,當隊列為空時,返回0訪問迷宮矩陣中節(jié)點void visit(int row,int col,int maze4141)建立新的隊列節(jié)點visit_point,將其值分別賦為row, col,head-1,mazerowcol=2,表示該節(jié)點以被訪問過;調(diào)用enqueue(visit_point),將該節(jié)點入隊路徑求解void mgpath(int maze4141,int m,int n)先定義入口節(jié)點為struct point p=0,0,-1,從maze00開始訪問。如果入口處即為障礙,則此迷宮無解,返回0 ,程序結(jié)束。否則訪問入口節(jié)點,將入口節(jié)點標記為訪問過mazep.rowp.col=2,調(diào)用函數(shù)enqueue(p)將該節(jié)點入隊。判斷隊列是否為空,當隊列不為空時,則運行以下操作: 調(diào)用dequeue()函數(shù),將隊頭元素返回給p,如果p.row=m-1且p.col=n-1,即到達出口節(jié)點,即找到了路徑,結(jié)束如果p.col+1n且mazep.rowp.col+1=0,說明未到迷宮右邊界,且其右方有通路,則visit(p.row,p.col+1,maze),將右邊節(jié)點入隊標記已訪問如果p.row+10且mazep.rowp.col-1=0,說明未到迷宮左邊界,且其左方有通路,則visit(p.row,p.col-1,maze),將左方節(jié)點入隊標記已訪問如果p.row-10且mazep.row-1p.col=0,說明未到迷宮上邊界,且其上方有通路,則visit(p.row,p.col+1,maze),將上方節(jié)點入隊標記已訪問訪問到出口(找到路徑)即p.row=m-1且p.col=n-1,則逆序?qū)⒙窂綐擞洖?即mazep.rowp.col=3;while(p.predecessor!=-1)p=queuep.predecessor; mazep.rowp.col=3; 最后將路徑圖形打印出來。3.菜單選擇 while(cycle!=(-1) 手動生成迷宮 請按:1 自動生成迷宮 請按:2 退出 請按:3 scanf(%d,&i); switch(i) case 1:請輸入行列數(shù)(如果超出預設范圍則提示重新輸入) shoudong_maze(m,n); print_maze(m,n);mgpath(maze,m,n);if(X!=0) result_maze(m,n);case 2 :請輸入行列數(shù)(如果超出預設范圍則提示重新輸入) zidong_maze(m,n);print_maze(m,n);mgpath(maze,m,n);if(X!=0) result_maze(m,n);case 3:cycle=(-1); break;注:具體源代碼見附錄5 測試分析測試數(shù)據(jù),輸出測試的結(jié)果,這里的測試數(shù)據(jù)應該完整和嚴格。并對結(jié)果進行分析。測試數(shù)據(jù)及結(jié)果如下:在調(diào)試過程中,首先使用的是棧進行存儲,但是產(chǎn)生的路徑是多條或不是最短路徑,所以通過算法比較,棧算法求得的路徑不一定是最短路徑,而用隊列求得的路徑是最短路徑。6 課程設計總結(jié)通過這段時間的課程設計,本人對計算機的應用,數(shù)據(jù)結(jié)構(gòu)的作用以及C語言的使用都有了更深的了解。尤其是C語言的進步讓我深刻的感受到任何所學的知識都需要實踐,沒有實踐就無法真正理解這些知識以及掌握它們,使其成為自己的財富。在理論學習和上機實踐的各個環(huán)節(jié)中,通過自主學習和請教老師,我收獲了不少。當然也遇到不少的問題,也正是因為這些問題引發(fā)的思考給我?guī)Я耸斋@。從當初不喜歡上機寫程序到現(xiàn)在能主動寫程序,從當初拿著程序不只如何下手到現(xiàn)在知道如何分析問題,如何用專業(yè)知識解決實際問題的轉(zhuǎn)變,我發(fā)現(xiàn)無論是專業(yè)知識還是動手能力,自己都有很大程度的提高。在這段時間里,我對for、while等的循環(huán)函數(shù)用法更加熟悉,逐漸形成了較好的編程習慣。在老師的指導幫助下,同學們課余時間的討論中,這些問題都一一得到了解決。在程序的調(diào)試能力上,無形中得到了許多的提高。例如:頭文件的使用,變量和數(shù)組的范圍問題,定義變量時出現(xiàn)的問題等等。在實際的上機操作過程中,不僅是讓我們了解數(shù)據(jù)結(jié)構(gòu)的理論知識,更重要的是培養(yǎng)解決實際問題的能力,所以相信通過此次實習可以提高我們分析設計能力和編程能力,為后續(xù)課程的學習及實踐打下良好的基礎。在這次短短的課程實踐里,我們得到了老師的關心和幫助。她給了我們很多的信息,與我們一起探討問題,詢問我們遇到了哪些問題并耐心給予指導。當我們遇到技術(shù)上難以解決的問題時,她就會指導我們解決問題,她把自己多年來積累的經(jīng)驗教授給我們,使我們順利地完成了課程實踐任務。時間過得真快,大學生活不知不覺就走過了一年,一年的大學學習和課程實踐階段的提高,使我們本身知識得到提高的同時,也增強了我們對未來工作的信心,我們相信自己未來三年的學習更使我們有能力勝任將來的工作。參考文獻1 黃同成,黃俊民,董建寅數(shù)據(jù)結(jié)構(gòu)M北京:中國電力出版社,20082 董建寅,黃俊民,黃同成數(shù)據(jù)結(jié)構(gòu)實驗指導與題解M北京:中國電力出版社,20083 嚴蔚敏,吳偉民. 數(shù)據(jù)結(jié)構(gòu)(C語言版)M. 北京:清華大學出版社,20024 劉振鵬,張曉莉,郝杰數(shù)據(jù)結(jié)構(gòu)M北京:中國鐵道出版社,2003附錄(源程序清單)#includestdlib.h#includestdio.h#define N 39#define M 39int X;int mazeN+2M+2;struct pointint row,col,predecessor;queue512;int head=0,tail=0;void shoudong_maze(int m,int n)int i,j;printf(nn);printf(請按行輸入迷宮,0表示通路,1表示障礙:nn);for(i=0;im;i+)for(j=0;jn;j+) scanf(%d,&mazeij);void zidong_maze(int m,int n)int i,j;printf(n迷宮生成中nn);system(pause);for(i=0;im;i+)for(j=0;jn;j+)mazeij=rand()%2;/由于rand()產(chǎn)生的隨機數(shù)是從0到RAND_MAX/RAND_MAX是定義在stdlib.h中的,其值至少為32767)/要產(chǎn)生從X到Y(jié)的數(shù),只需要這樣寫:k=rand()%(Y-X+1)+X; void print_maze(int m,int n)int i,j;printf(n迷宮生成結(jié)果如下:nn);printf(迷宮入口n);printf();for(i=0;im;i+)printf(n);for(j=0;jn;j+) if(mazeij=0) printf(); if(mazeij=1) printf();printf(迷宮出口n);void result_maze(int m,int n)int i,j;printf(迷宮通路(用表示)如下所示:nt);for(i=0;im;i+)printf(n); for(j=0;jn;j+) if(mazeij=0|mazeij=2) printf(); if(mazeij=1) printf(); if(mazeij=3) printf(); void enqueue(struct point p)queuetail=p;tail+;struct point dequeue()head+;return queuehead-1;int is_empty()return head=tail;void visit(int row,int col,int maze4141)struct point visit_point=row,col,head-1;mazerowcol=2;enqueue(visit_point);int mgpath(int maze4141,int m,int n)X=1;struct point p=0,0,-1;if(mazep.rowp.col=1)printf(n=n);printf(此迷宮無解nn);X=0;return 0;mazep.rowp.col=2;enqueue(p);while(!is_empty()p=dequeue();if(p.row=m-1)&(p.col=n-1) break;if(p.col+1n)&(mazep.rowp.col+1=0) visit(p.row,p.col+1,maze);if(p.row+1=0)&(mazep.rowp.col-1=0) visit(p.row,p.col-1,maze);if(p.row-1=0)&(mazep.row-1p.col=0) visit(p.row-1,p.col,maze);if(p.row=m-1&p.col=n-1)printf(n=n);printf(迷宮路徑為:n);printf(%d,%d)n,p.row,p.col);mazep.rowp.col=3;while(p.predecessor!=-1)p=queuep.predecessor;printf(%d,%d)n,p.row,p.col);mazep.rowp.col=3;else printf(n=n); printf(此迷宮無解!nn);X=0;return 0;void main()int i,m,n,cycle=0;while(cycle!=(-1)printf(*n); printf(歡迎進入迷宮求解系統(tǒng)n);printf(*n); printf( 手動生成迷宮 請按:1n); printf( 自動生成迷宮 請按:2n); printf( 退出 請按:3nn); printf(*n); printf(n); printf(請選擇你的操作:n); scanf(%d,&i); switch(i) case 1:printf(n請輸入行數(shù):);scanf(%d,&m); printf(n); printf(請輸入列數(shù):);scanf(%d,&n); while(m39)|(n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024成都師范學院輔導員招聘筆試真題
- 2025年抗肝片吸蟲病藥合作協(xié)議書
- 2025年空氣和廢氣監(jiān)測儀器項目合作計劃書
- 2025年湖南省退役軍人事務廳下屬事業(yè)單位招聘考試筆試試題【答案】
- 2025年江西省農(nóng)業(yè)農(nóng)村廳下屬事業(yè)單位招聘考試筆試試題【答案】
- 2025年教師招聘考試教育綜合理論知識復習題庫(300題)【答案】
- 2025年印刷品、記錄媒介復制品合作協(xié)議書
- 項目投資管理制度 (一)
- 課堂教學效益年活動開展情況匯報
- 消防值班制度
- 2025江蘇省惠隆資產(chǎn)管理限公司招聘30人易考易錯模擬試題(共500題)試卷后附參考答案
- 籍貫對照表完整版
- 2022年北京公共交通控股(集團)有限公司招聘筆試試題及答案解析
- 壓力管道基礎知識(管理類)
- 氣體滅火系統(tǒng)驗收表1
- 新北師大版六年級上冊數(shù)學全冊教學課件
- DB1309T 256-2021 榆三節(jié)葉蜂綜合防治技術(shù)規(guī)程
- 土木工程概論全套課件完整版電子教案最新板
- 超星爾雅學習通《聲光影的內(nèi)心感動電影視聽語言(四川大學)》章節(jié)測試答案
- 燃氣工程計價規(guī)則及定額應用
- 上教社深圳版小學英語1-6年級單詞匯總
評論
0/150
提交評論