

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 《算法與數(shù)據(jù)結(jié)構(gòu)》</b></p><p><b> 課程設(shè)計說明書</b></p><p> 題目: 漫 步 迷 宮 </p><p><b> 目 錄</b></p><p> 一、課程設(shè)
2、計題目3</p><p><b> 二、問題描述3</b></p><p><b> 三、基本要求3</b></p><p><b> 四、設(shè)計思想3</b></p><p> 4.1 函數(shù)的功能和參數(shù)3</p><p> 4.2存儲
3、結(jié)構(gòu)的選擇4</p><p> 4.3迷宮有解無解情況的解讀5</p><p> 五、漫步迷宮源程序5</p><p><b> 六、運行結(jié)果10</b></p><p> 6.1 主界面10</p><p> 6.2 手動生成迷宮10</p><p>
4、; 6.3 自動生成迷宮13</p><p> 七、設(shè)計過程出現(xiàn)的問題和優(yōu)點14</p><p> 八、設(shè)計的心得體會17</p><p> 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計-------漫步迷宮</p><p> 課程設(shè)計題目:漫步迷宮</p><p><b> 問題描述:</b><
5、/p><p> 用m行n列的m*n個正方格表示一個迷宮,其中劃有斜線的方格表示不可通行,未劃有斜線的方格表示通行。請編寫尋找從入口到出口的一條最短路徑的程序。</p><p><b> 基本要求:</b></p><p> 迷宮的規(guī)則(即行數(shù)和列數(shù)),狀態(tài)設(shè)置(即各方格能否通行的狀態(tài)),以及入口和出口的位置,均應(yīng)由輸入隨機確定。</p&
6、gt;<p> 求得的最短路徑,應(yīng)該以從入口到出口的路徑上的各個方格的坐標(biāo)的線性序列輸出。當(dāng)無通路是,應(yīng)該報告無路徑的信息。</p><p> 盡量采用結(jié)構(gòu)化程序設(shè)計方法,要求對各個模塊的功能及參數(shù)做必要的說明。</p><p><b> 設(shè)計思想</b></p><p><b> 函數(shù)的功能和參數(shù)</b&
7、gt;</p><p><b> 存儲結(jié)構(gòu)的選擇</b></p><p> 在這個編寫的迷宮程序中,我采用的是隊列,而沒有采用棧這種數(shù)據(jù)結(jié)構(gòu)。隊列將迷宮的每個點都用順序存儲的方式將它存儲起來,便于在需找路徑是廣度優(yōu)先搜索。</p><p> 首先是將迷宮的各個點的是否通路用0和1表示出來,形成數(shù)組,存入到maze這個數(shù)組中。當(dāng)指定一個入口
8、時,首先判斷該點是否為通路,若不為通路則直接輸出“此迷宮無解”,然后再判斷所處位置的前后左右的四個方向上的連通性和是否為出口,連通則記在隊列中,若為出口,則停止入隊列。在要尋找迷宮路徑時,從出口開始回溯查找,將在出口到入口這條路徑上的點的值記為3,便于輸出迷宮路徑。</p><p> 在這個程序中我們要尋找的是迷宮的最短路徑,所以要用廣度優(yōu)先搜索,在用廣度優(yōu)先搜索時,每個點都會觀察它的前后左右的連通性,每走一步
9、便記錄一下,最后走出迷宮的路徑便一定是最短的。</p><p> 編寫此段程序所用語言為C語言。</p><p> 4.3迷宮的有解和無解的情況解讀:</p><p> 在這個迷宮中會出現(xiàn)無解的情況,特別是在自動生成迷宮的時候,甚至還有自動生成迷宮的入口和出口,在自動生成時,給點的賦值為0或1,每個點連通的情況時一半一半的,這樣的概率也就導(dǎo)致了它的無解。無解也
10、就說明了出口和入口不在一個連通分量上。</p><p><b> 漫步迷宮源程序</b></p><p> #include"stdlib.h"</p><p> #include"stdio.h"</p><p> #define N 50</p><
11、p> #define M 50</p><p><b> int X;</b></p><p> int maze[N][M];</p><p> struct point{</p><p> int row,col,predecessor;</p><p> }queue[51
12、2];</p><p> int head=0,tail=0;</p><p> void creat_maze(int m,int n){</p><p><b> int i,j;</b></p><p> printf("\n\n");</p><p> pri
13、ntf("請按行輸入迷宮,0表示通路,1表示障礙:\n\n");</p><p> for(i=0;i<m;i++)</p><p> for(j=0;j<n;j++)</p><p><b> {</b></p><p> printf("maze[%d][%d]:&q
14、uot;,i,j);</p><p> scanf("%d",&maze[i][j]);</p><p><b> }</b></p><p><b> }</b></p><p> void present_maze(int m,int n){</p>
15、;<p><b> int i,j;</b></p><p> printf("\n迷宮自動生成中……\n\n");</p><p> system("pause");</p><p> for(i=0;i<m;i++)</p><p> for(j=
16、0;j<n;j++)</p><p> maze[i][j]=rand()%2;</p><p><b> }</b></p><p> void present_in(int m,int n,int &a,int &b)</p><p><b> {</b></
17、p><p> printf("\n迷宮入口自動生成中……\n\n");</p><p> system("pause");</p><p> a=rand()%m;</p><p> b=rand()%n;</p><p><b> }</b><
18、/p><p> void present_out(int m,int n,int &c,int &d)</p><p><b> {</b></p><p> printf("\n迷宮出口自動生成中……\n\n");</p><p> system("pause"
19、;);</p><p> c=rand()%m;</p><p> d=rand()%n;</p><p><b> }</b></p><p> void print_maze(int m,int n,int a,int b,int c,int d){</p><p><b>
20、 int i,j;</b></p><p> printf("\n迷宮生成結(jié)果如下:\n\n");</p><p> //printf("迷宮入口\n");</p><p> //printf("↓");</p><p> for(i=0;i<m;i++)
21、</p><p> {printf("\n");</p><p> for(j=0;j<n;j++) </p><p> {if(maze[i][j]==0) printf("□");</p><p> if(maze[i][j]==1) printf("■");}&l
22、t;/p><p><b> }</b></p><p> //printf("→迷宮出口\n");</p><p><b> }</b></p><p> void result_maze(int m,int n){</p><p><b>
23、 int i,j;</b></p><p> printf("迷宮通路(用& 表示)如下所示:\n\t");</p><p> for(i=0;i<m;i++)</p><p> {printf("\n");</p><p> for(j=0;j<n;j++)&
24、lt;/p><p> {if(maze[i][j]==0||maze[i][j]==2) printf("□");</p><p> if(maze[i][j]==1) printf("■");</p><p> if(maze[i][j]==3) printf("& ");</p>
25、<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void enqueue(struct point p){</p><p> queue[tail]=p;</p>&
26、lt;p><b> tail++;</b></p><p><b> }</b></p><p> struct point dequeue(){</p><p><b> head++;</b></p><p> return queue[head-1];&l
27、t;/p><p><b> }</b></p><p> int is_empty(){</p><p> return head==tail;</p><p><b> }</b></p><p> void visit(int row,int col,int maz
28、e[50][50]){</p><p> struct point visit_point={row,col,head-1};</p><p> maze[row][col]=2;</p><p> enqueue(visit_point);</p><p><b> }</b></p><p
29、> int mazepath(int maze[50][50],int m,int n,int a ,int b,int c,int d){</p><p><b> X=1;</b></p><p> struct point p={a,b,-1};</p><p> if(maze[p.row][p.col]==1)</
30、p><p> {printf("\n*****************************************************\n");</p><p> printf("此迷宮無解\n\n");X=0;return 0;}</p><p> maze[p.row][p.col]=2;</p>
31、<p> enqueue(p);</p><p> while(!is_empty())</p><p> {p=dequeue();</p><p> if((p.row==c)&&(p.col==d)) break;</p><p> if((p.row+1<m)&&(maze[p
32、.row+1][p.col]==0)) visit(p.row+1,p.col,maze);</p><p> if((p.col+1<n)&&(maze[p.row][p.col+1]==0)) visit(p.row,p.col+1,maze);</p><p> if((p.col-1>=0)&&(maze[p.row][p.col-1
33、]==0)) visit(p.row,p.col-1,maze);</p><p> if((p.row-1>=0)&&(maze[p.row-1][p.col]==0)) visit(p.row-1,p.col,maze);</p><p><b> }</b></p><p> if(p.row==c&&
34、amp;p.col==d)</p><p> {printf("\n***************************************************n");</p><p> printf("迷宮路徑為:\n");</p><p> printf("(%d,%d)\n",p.ro
35、w,p.col);</p><p> maze[p.row][p.col]=3;</p><p> while(p.predecessor!=-1)</p><p> {p=queue[p.predecessor];</p><p> printf("(%d,%d)\n",p.row,p.col);</p&g
36、t;<p> maze[p.row][p.col]=3;</p><p><b> }</b></p><p><b> }</b></p><p> else {printf("\n************************************************\n&quo
37、t;);</p><p> printf("此迷宮無解!\n\n");X=0;}</p><p><b> return 0;</b></p><p><b> }</b></p><p> void main()</p><p> {int i
38、,m,n,a,b,c,d,j,cycle=0;</p><p> while(cycle!=(-1))</p><p><b> {</b></p><p> printf("*********************************************************************\n"
39、);</p><p> printf(" 2011-2012學(xué)年第二學(xué)期數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 \n");</p><p> printf(" ------漫步迷宮 \n");</
40、p><p> printf(" 開發(fā)員:曾祥柯 \n");</p><p> printf(" 班 級:10計算本1班 \n");</p&g
41、t;<p> printf(" 學(xué) 號:1015023129 \n");</p><p> printf(" 歡迎進入漫步迷宮 \n");</p&g
42、t;<p> printf("*********************************************************************\n");</p><p> printf(" 手動生成迷宮 請按:1\n");</p><p> printf("
43、 自動生成迷宮 請按:2\n");</p><p> printf(" 退出漫步迷宮 請按:3\n\n");</p><p> printf("*********************************************************************\n");</p>
44、;<p> printf("\n");</p><p> printf("請選擇你的操作:\n");</p><p> scanf("%d",&i);</p><p><b> switch(i)</b></p><p> {ca
45、se 1:printf("\n請輸入行數(shù):");scanf("%d",&m);</p><p> printf("\n");</p><p> printf("請輸入列數(shù):");scanf("%d",&n);</p><p> while((m&
46、lt;=0||m>50)||(n<=0||n>50))</p><p> {printf("\n抱歉,你輸入的行列數(shù)超出預(yù)設(shè)范圍(0-50,0-50),請重新輸入:\n\n");</p><p> printf("請輸入行數(shù):");scanf("%d",&m);</p><p>
47、; printf("\n");</p><p> printf("請輸入列數(shù):");scanf("%d",&n);</p><p><b> }</b></p><p> creat_maze(m,n);</p><p> print_maze
48、(m,n,a,b,c,d);</p><p> printf("\n");</p><p> printf("*********************************************************************\n");</p><p> printf("
49、 手動輸入迷宮入口 請按:1\n");</p><p> printf(" 自動生成迷宮入口 請按:2\n");</p><p> printf("*********************************************************************\n");</p&g
50、t;<p> printf("\n");</p><p> printf("請選擇你的操作:\n");</p><p> scanf("%d",&j);</p><p><b> switch(j)</b></p><p> {c
51、ase 1: printf("請輸入入口坐標(biāo):");scanf("%d,%d",&a,&b);</p><p> while((a<0||a>m-1)||(b<0||b>n-1))</p><p> {printf("\n抱歉,你輸入的行列數(shù)超出預(yù)設(shè)范圍(0-%d ,0-%d ),請重新輸入:\n
52、\n",m-1,n-1);</p><p> printf("請輸入入口坐標(biāo):");scanf("%d,%d",&a,&b);}break;</p><p> case 2: present_in(m,n,a,b);break;</p><p><b> }</b><
53、/p><p> printf("\n");</p><p> printf("請輸入出口坐標(biāo):");scanf("%d,%d",&c,&d);</p><p> while((c<0||c>m-1)||(d<0||d>n-1))</p><p&g
54、t; {printf("\n抱歉,你輸入的行列數(shù)超出預(yù)設(shè)范圍(0-%d ,0-%d ),請重新輸入:\n\n",m-1,n-1);</p><p> printf("請輸入入口坐標(biāo):");scanf("%d,%d",&c,&d);</p><p><b> }</b></p>
55、<p> print_maze(m,n,a,b,c,d);</p><p> mazepath(maze,m,n,a,b,c,d);</p><p> if(X!=0) result_maze(m,n);</p><p> printf("\n\nPress Enter Contiue!\n");getchar();whil
56、e(getchar()!='\n');break;</p><p> case 2:printf("\n請輸入行數(shù):");scanf("%d",&m);</p><p> printf("\n");</p><p> printf("請輸入列數(shù):");sca
57、nf("%d",&n);</p><p> while((m<=0||m>50)||(n<=0||n>50))</p><p> {printf("\n抱歉,你輸入的行列數(shù)超出預(yù)設(shè)范圍(0-50,0-50),請重新輸入:\n\n");</p><p> printf("請輸入行數(shù)
58、:");scanf("%d",&m);</p><p> printf("\n");</p><p> printf("請輸入列數(shù):");scanf("%d",&n);</p><p><b> }</b></p>&l
59、t;p> present_maze(m,n);</p><p> print_maze(m,n,a,b,c,d);</p><p> printf("\n");</p><p> printf("請輸入入口坐標(biāo):");scanf("%d,%d",&a,&b);</p>
60、;<p> printf("\n");</p><p> printf("請輸入出口坐標(biāo):");scanf("%d,%d",&c,&d);</p><p> mazepath(maze,m,n,a,b,c,d);</p><p> if(X!=0) result_maz
61、e(m,n);</p><p> printf("\n\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break;</p><p> case 3:cycle=(-1);break;</p><p> default:printf("\n&qu
62、ot;);printf("你的輸入有誤!\n");</p><p> printf("\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break;</p><p><b> }</b></p><p><b&
63、gt; }</b></p><p><b> }</b></p><p><b> 運行結(jié)果</b></p><p> 將該程序的各個功能都運行了結(jié)果,分為主界面、手動建立迷宮、自動生成迷宮、自動生成入口等模塊。</p><p><b> 主界面:</b>
64、</p><p> 手動生成迷宮(老師所給迷宮):</p><p> 此迷宮的圖解和路線可寫為:</p><p> | 0 1 1 1 1 1 1 1 1 1 |</p><p> | 0 1 0 0 1 0 0 0 1 1 |</p><p> | 0 0 0 1 1 0 1 0 0 1 | 入口坐
65、標(biāo)為[0,0]</p><p> A.maze= | 0 1 1 0 0 0 1 1 0 1 |</p><p> | 0 0 0 0 1 0 0 0 0 1 | 出口坐標(biāo)為[5,9]</p><p> | 1 1 1 1 1 1 1 1 0 0 |</p><p> 則輸出的最短路徑應(yīng)該是:</p><p
66、> [5,9] --[5,8]ß--[4,8]ß--[4,7]ß--[4,6]</p><p> --[4,5]--[3,5]--[3,4]--[3, 3] --[4,3]</p><p> --[4,2]--[4,1]--[4,0]--[3,0]--[2,0]</p><p> --[1,0]--[0,0]</p&
67、gt;<p> 手動生成迷宮(自己編寫的迷宮)且自動生成迷宮入口:</p><p> 自動生成迷宮(無解的情況):</p><p> 自動生成迷宮(有解的情況):</p><p> 七、設(shè)計過程中出現(xiàn)的問題及優(yōu)點</p><p> 1、這段程序為網(wǎng)上下載而來,剛開始時程序有很多版塊都不夠完整,沒有歡迎界面,于是在主程序
68、中做了界面的輸出。</p><p> 2、在程序運行中還有一個問題是剛開始時是把迷宮的入口和出口的坐標(biāo)給出后才顯示原始的迷宮圖,這樣在自動生成迷宮時很容易出現(xiàn)無解的情況,也無法很好的驗證自動生成迷宮這一模塊的正確性。于是將原始迷宮的輸出函數(shù)print_maze(m,n,a,b,c,d)提前調(diào)用了,解決了這一問題。</p><p> 3、剛拿到這個程序時,它不能很好的對迷宮的大小超出范圍
69、進行報錯功能,這是因為沒有對輸入的行數(shù)列數(shù)與它的最大值進行比較,在加了</p><p> while((m<=0||m>50)||(n<=0||n>50))后就解決了這個問題。</p><p> 4、做這個迷宮程序最主要的便是在找尋路徑時如何表示是路徑上的點,我采用的方法是將這個點的值賦值為3表示訪問過,將這個點的值賦值為2表示為通路但不在此路徑上。</p
70、><p> 5、在此段程序中我并沒有采用老師所說的加圍墻的方法,這樣就減少了程序的空間復(fù)雜度,但增加了時間復(fù)雜度。</p><p> 6、這個程序有個閃光點就是可以自動生成迷宮、出口和入口,而自動生成所需進行的運算方法便是:maze[i][j]=rand()%2,通過除2取余的方法將點的值賦值為0或1。</p><p> 通過這個運算,我知道了要想隨機產(chǎn)生X到Y(jié)的
71、數(shù)可以講語句寫為:k=rand()%(Y-X+1)+X,這就是學(xué)習(xí)時的舉一反三。</p><p> 7、該程序還有個優(yōu)點便是能夠把迷宮的最短路徑用圖形直接的顯示出來,也讓我們不必去對著路徑重新畫圖。</p><p> 8、在自動生成迷宮后馬上將其圖形輸出出來,便于我們確定它的入口和出口,也就減少了迷宮無解的概率。</p><p> 9、這個迷宮的大小我設(shè)定的是
72、行列數(shù)各50,而屏幕只能裝下大概30*30的數(shù),當(dāng)我們要創(chuàng)建大小為50*50的迷宮時就會出現(xiàn)迷宮輸出不完全的情況,反映出來的圖形如下:</p><p> 10、現(xiàn)在這個程序還是存在一些問題,在自動生成迷宮時他便不能在自動生成入口出口,這個是需要完善的,但如果都是自動生成的會造成的后果便是迷宮無解的情況概率會很大,運行時的顯示如下:</p><p> 11、還有個待解決的問題便是在手動輸
73、入迷宮時,只能自動生成入口而不能自動生成出口,運行情況如下:</p><p> 12、這個程序后來自己還有一個想法就是把自己以前手動創(chuàng)建的迷宮按創(chuàng)建者意見保存下來,以便下回用同一個迷宮時減少輸入的麻煩,但這個功能沒有實現(xiàn)。這個功能需要實現(xiàn)文件的讀取。同時可以增加在一次游戲時多次輸入出口和入口,提高一個迷宮的利用率。</p><p><b> 八、設(shè)計的心得體會</b&g
74、t;</p><p> 剛開始拿到這個課程設(shè)計的題目的時候有點手足無措,因為不知道從哪開始下手,也不知道到底用什么數(shù)據(jù)結(jié)構(gòu)比較好,后來老師跟我們花了一節(jié)課進行講解,自己查找了一些資料才開始了有了一些概念,通過這次課程設(shè)計,我了解到了做隊列的算法和廣度優(yōu)先搜索的方法,也更加熟悉了C語言。</p><p> 由于能力有限,有很多自己想要的功能都沒能實現(xiàn),在這個時候自己也感到了十分的無奈,所
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮
- 數(shù)據(jù)結(jié)構(gòu)c語言課程設(shè)計報告之迷宮
- 迷宮問題——數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(迷宮問題)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-迷宮求解
- 迷宮游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-走迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)迷宮問題課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計—迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題課程設(shè)計報告
評論
0/150
提交評論