版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)</p><p><b> 迷宮求解</b></p><p><b> 班級: </b></p><p><b> 學(xué)號: </b></p><p><b> 姓名: </b></p&g
2、t;<p><b> 指導(dǎo)老師: </b></p><p><b> 迷宮求解</b></p><p><b> 問題描述</b></p><p> 輸入一個(gè)任意大小的迷宮數(shù)據(jù),用遞歸和非遞歸兩種方法求出一條走出迷宮的路徑,并將路徑輸出。</p><p>
3、<b> 設(shè)計(jì)思路</b></p><p> 從入口出發(fā),按某一方向向前探索,若能走通并且未走過,即某處可以到達(dá),則到達(dá)新點(diǎn),否則試探下一個(gè)方向;若所有的方向均沒有通路,則沿原路返回前一點(diǎn),換下一個(gè)方向再繼續(xù)試探,直到找到一條通路,或無路可走又返回入口點(diǎn)。</p><p> 在求解過程中,為了保證在到達(dá)某一點(diǎn)后不能向前繼續(xù)行走(無路)時(shí),能正確返回前一點(diǎn)以便繼續(xù)
4、從下一個(gè)方向向前試探,則需要用一個(gè)棧(遞歸不需要)保存所能夠到達(dá)的每一點(diǎn)的下標(biāo)及從該點(diǎn)前進(jìn)的方向。設(shè)迷宮為m行n列,利用maze[m][n]來表示一個(gè)迷宮,maze[i][j]=0或1;其中:0表示通路,1表示不通,當(dāng)從某點(diǎn)向下試探時(shí),中間點(diǎn)有四個(gè)方向可以試探,而四個(gè)角點(diǎn)有兩個(gè)方向,其他邊緣點(diǎn)有三個(gè)方向,為使問題簡單化,用maze[m+2][n+2]來表示迷宮,而迷宮的四周的值全部為1,這樣做使問題簡單了,每個(gè)點(diǎn)的試探方向全部為4,不用
5、再判斷當(dāng)前點(diǎn)的試探方向有幾個(gè)。</p><p><b> 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</b></p><p> 在上述表示迷宮的情況下,每個(gè)點(diǎn)有4個(gè)方向去試探,如當(dāng)前點(diǎn)的坐標(biāo)(x,y),與其相鄰的4個(gè)點(diǎn)的坐標(biāo)都可根據(jù)與該點(diǎn)的相鄰方位而得到。因?yàn)槌隹谠冢╩,n),因此試探順序規(guī)定為:從當(dāng)前位置向前試探的方向?yàn)閺恼龞|沿順時(shí)針方向進(jìn)行。為了簡化問題,方便求出新點(diǎn)的坐標(biāo),將從正東開始沿
6、順時(shí)針進(jìn)行的4個(gè)方向的坐標(biāo)增量放在一個(gè)結(jié)構(gòu)數(shù)組move[4]中,在move數(shù)組中,每個(gè)元素有兩個(gè)域組成,x為橫坐標(biāo)增量,y為縱坐標(biāo)增量。這樣對move設(shè)計(jì)會很方便地求出從某點(diǎn)(x,y)按某一方向v(0<=v<=3)到達(dá)的新點(diǎn)(i,j)的坐標(biāo):i=x+move[v].x;j=y+move[v].y;</p><p> 當(dāng)?shù)竭_(dá)了某點(diǎn)而無路可走時(shí)需返回前一點(diǎn),再從前一點(diǎn)開始向下一個(gè)方向繼續(xù)試探。因此,壓入
7、棧中的不僅是順序到達(dá)的各點(diǎn)的坐標(biāo),而且還要有從前一點(diǎn)到達(dá)本點(diǎn)的方向。棧中元素是一個(gè)由行、列、方向組成。具體結(jié)構(gòu)定義如下:</p><p> #define m 3</p><p> #define n 3</p><p> typedef struct{</p><p> int x,y; </p>&
8、lt;p> }item; /*路線移動的方向坐標(biāo),x為橫向,y縱向*/</p><p> item move[4];(遞歸只需定義到這里)</p><p> typedef struct{</p><p> int x,y,d;</p><p> }Datatype;
9、 /*路線移動的方向坐標(biāo),x為橫坐標(biāo),y為總坐標(biāo)*/</p><p> typedef struct{</p><p> Datatype data[MAXSIZE]; /*存儲路線移動的方向坐標(biāo)*/</p><p><b> int top;</b></p><p> }
10、SeqStack,*PSeqStack;</p><p><b> 功能函數(shù)設(shè)計(jì)</b></p><p> 迷宮棧的實(shí)現(xiàn)函數(shù)mazepath()</p><p> 迷宮遞歸的實(shí)現(xiàn)函數(shù)path()</p><p> 為了防止重復(fù)達(dá)到某點(diǎn),以避免發(fā)生死循環(huán),每次達(dá)到了某點(diǎn)(i,j)后,改變maze[i][j]的值,迷
11、宮棧的實(shí)現(xiàn)直接置-1,算法結(jié)束前恢復(fù)原迷宮;而迷宮遞歸是將當(dāng)前值置為已走的步驟,這樣輸出時(shí)對走過的路更顯而易見。</p><p><b> 棧的函數(shù)設(shè)計(jì):</b></p><p> 棧的初始化函數(shù) Init_SeqStack()</p><p> 判棧空 Empty_SeqStack()</p><p
12、> 入棧函數(shù) Push_SeqStack()</p><p> 出棧函數(shù) Pop_SeqStack()</p><p> 取棧頂函數(shù) GetTop_SeqStack()</p><p> 銷毀棧 Destroy_SeqStack()</p><p><b> 程序代碼&
13、lt;/b></p><p><b> 迷宮棧:</b></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #define MAXSIZE 100</p><p> #define
14、 m 3 </p><p> #define n 3 /*定義迷宮的行數(shù)和列數(shù),可更改*/</p><p> typedef struct{</p><p><b> int x,y;</b></p><p><b&g
15、t; }item;</b></p><p> item move[4]; /*路線移動的方向坐標(biāo)*/</p><p> typedef struct{</p><p> int x,y,d;</p><p> }Datatype;
16、 /*橫縱坐標(biāo)及方向*/</p><p> typedef struct{</p><p> Datatype data[MAXSIZE];</p><p><b> int top;</b></p><p> }SeqStack,*PSeqStack; /*定義棧*/<
17、/p><p> PSeqStack Init_SeqStack(void) /*初始化棧*/</p><p><b> {</b></p><p> PSeqStack S;</p><p> S=(PSeqStack)malloc(sizeof(SeqStack));</p>&l
18、t;p><b> if(S)</b></p><p> S->top=-1;</p><p><b> return S;</b></p><p><b> }</b></p><p> int Empty_SeqStack(PSeqStack S)
19、 /*判棧空*/</p><p><b> {</b></p><p> if(S->top==-1)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b&
20、gt; return 0;</b></p><p><b> }</b></p><p> int Push_SeqStack(PSeqStack S,Datatype x) /*入棧*/</p><p><b> {</b></p><p> if(S->top==
21、MAXSIZE-1)</p><p><b> return 0;</b></p><p><b> else</b></p><p><b> {</b></p><p><b> S->top++;</b></p><
22、p> S->data[S->top]=x;</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> int Pop_SeqStack(PSeqStack S,
23、Datatype *x) /*出棧*/</p><p><b> {</b></p><p> if(Empty_SeqStack(S))</p><p><b> return 0;</b></p><p><b> else</b></p>&
24、lt;p><b> {</b></p><p> *x=S->data[S->top];</p><p><b> S->top--;</b></p><p><b> return 1;</b></p><p><b> }<
25、/b></p><p><b> }</b></p><p> void Destroy_SeqStack(PSeqStack *S) /*毀棧*/</p><p><b> {</b></p><p><b> if(*S)</b></p&g
26、t;<p><b> free(*S);</b></p><p><b> *S=NULL;</b></p><p><b> return;</b></p><p><b> }</b></p><p> int mazepath
27、(int maze[][n+2],item move[4],int x0,int y0) /*迷宮功能實(shí)現(xiàn)函數(shù)*/</p><p> {/*求迷宮路徑,入口參數(shù):迷宮數(shù)組,下標(biāo)移動的增量數(shù)組,開始點(diǎn)(x0,y0),0(m,n)是終點(diǎn),返回值:1表示求出路徑,0表示無路徑*/</p><p> PSeqStack S;</p><p> Datatype t
28、emp;</p><p> int x,y,d,i,j;</p><p> temp.x=x0;</p><p> temp.y=y0;</p><p> temp.d=-1;</p><p> S=Init_SeqStack(); /*初始化棧*/</p>
29、<p><b> if(!S)</b></p><p><b> {</b></p><p> printf("棧初始化失敗");</p><p><b> return 0;</b></p><p><b> }</
30、b></p><p> Push_SeqStack(S,temp);</p><p> while(!Empty_SeqStack(S))</p><p><b> {</b></p><p> Pop_SeqStack(S,&temp);</p><p><b>
31、 x=temp.x;</b></p><p><b> y=temp.y;</b></p><p> d=temp.d+1;</p><p> while(d<4) /*存在剩余方向可以搜索*/</p><p><b> {</b
32、></p><p> i=x+move[d].x;</p><p> j=y+move[d].y;</p><p> if(maze[i][j]==0) /*此方向可以走*/</p><p><b> {</b></p><p><b> t
33、emp.x=x;</b></p><p><b> temp.y=y;</b></p><p><b> temp.d=d;</b></p><p> maze[x][y]=-1;</p><p> Push_SeqStack(S,temp); /*點(diǎn)(x,y)可以走,用棧保存可
34、以走的路徑*/</p><p><b> x=i;y=j;</b></p><p> if(x==m&&y==n) /*迷宮有路*/</p><p><b> {</b></p><p> while(!Empty_SeqStack(S))</
35、p><p><b> {</b></p><p> Pop_SeqStack(S,&temp);</p><p> printf("(%d,%d)<-",temp.x,temp.y); /*打印可以走的路徑*/</p><p><b> }</b></p&
36、gt;<p> Destroy_SeqStack(&S); /*銷毀棧*/</p><p><b> return 1;</b></p><p><b> }</b></p><p> else d=0; /*方向復(fù)位,從第一個(gè)方向開始試探*/&l
37、t;/p><p><b> }</b></p><p> else d++; /*試探下一個(gè)方向*/</p><p> } /*while(d<4)*/</p><p> } /*while*/</p><p> Destroy_S
38、eqStack(&S); /*銷毀棧*/</p><p> printf("迷宮無路徑\n"); </p><p> return 0; /*迷宮無路*/</p><p><b> }</b></p><p>
39、 void main()</p><p><b> {</b></p><p> item move[4];</p><p> int maze[m+2][n+2];</p><p><b> int i,j;</b></p><p> for(i=0;i<
40、m+2;i++) /*輸入迷宮,四周為1*/</p><p><b> {</b></p><p> for(j=0;j<n+2;j++)</p><p> scanf("%d",&maze[i][j]);</p><p><b
41、> }</b></p><p> move[0].x=1;move[0].y=0;</p><p> move[1].x=0;move[1].y=1;</p><p> move[2].x=-1;move[2].y=0;</p><p> move[3].x=0;move[3].y=-1;
42、 /*給方向坐標(biāo)賦值*/</p><p> mazepath(maze,move,1,1);</p><p><b> getch();</b></p><p><b> }</b></p><p><b> 迷宮遞歸:</b></p><p&g
43、t; #include<stdio.h></p><p> #include<stdlib.h></p><p> #define m 3</p><p> #define n 3</p><p> typedef struct{</p><p><b> int x,y;
44、</b></p><p><b> }item;</b></p><p> item move[4];</p><p> int path(int maze[][n+2],item move[],int x,int y,int step)</p><p> {/*求迷宮路徑,入口參數(shù):迷宮數(shù)組,下標(biāo)移
45、動的增量數(shù)組,開始點(diǎn)(x,y),以及開始點(diǎn)對應(yīng)的步數(shù)step,(m,n)是終點(diǎn),返回值:1表示求出路徑,0表示無路徑*/</p><p><b> int i;</b></p><p><b> step++;</b></p><p> maze[x][y]=step;</p><p> i
46、f(x==m&&y==n)</p><p> return 1; /*起始位置是出口,找到路徑,結(jié)束*/</p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> if(maze[x+mov
47、e[i].x][y+move[i].y]==0)</p><p> if(path(maze,move,x+move[i].x,y+move[i].y,step))</p><p> return 1; /*下一個(gè)是出口,則返回*/</p><p><b> }</b></p><p&g
48、t;<b> step--;</b></p><p> maze[x][y]=0;</p><p><b> return 0;</b></p><p><b> }</b></p><p> void main()</p><p><b
49、> {</b></p><p> item move[4];</p><p> int maze[m+2][n+2];</p><p><b> int i,j;</b></p><p> for(i=0;i<m+2;i++)</p><p><b>
50、 {</b></p><p> for(j=0;j<n+2;j++)</p><p> scanf("%d",&maze[i][j]);</p><p><b> }</b></p><p> printf("\n");</p>&l
51、t;p> move[0].x=1;move[0].y=0;</p><p> move[1].x=0;move[1].y=1;</p><p> move[2].x=-1;move[2].y=0;</p><p> move[3].x=0;move[3].y=-1;</p><p> if(path(maze,move,1,1
52、,1))</p><p><b> {</b></p><p> for(i=0;i<m+2;i++)</p><p><b> {</b></p><p> for(j=0;j<n+2;j++)</p><p> printf("%d &qu
53、ot;,maze[i][j]);</p><p> printf("\n");</p><p><b> }</b></p><p> } /*輸出有路迷宮的路線*/</p><p> else printf(“迷宮
54、無路徑\n”);</p><p><b> getch();</b></p><p><b> }</b></p><p><b> 運(yùn)行與測試</b></p><p><b> 迷宮棧(無路徑):</b></p><p>
55、<b> 有路徑:</b></p><p> 迷宮遞歸(無路徑):</p><p><b> 有路徑:</b></p><p><b> 設(shè)計(jì)心得</b></p><p> 迷宮這個(gè)問題也是老師經(jīng)常講的例子,是加深對棧運(yùn)用的好程序。這個(gè)程序又加了個(gè)遞歸的算法,相同的程
56、序不同的算法。我結(jié)合老師提過的思想與教材上的例子,很順利的完成了這個(gè)程序。其實(shí)在寫完這個(gè)程序后,我又想到了馬的遍歷,這兩個(gè)程序的設(shè)計(jì)思想極其相似,所以我很快又寫出馬的遍歷棧與遞歸的算法,并且運(yùn)行成功。</p><p> 至此,三個(gè)題目設(shè)計(jì)都完成了,每次上機(jī)都會遇到題目,這次也不例外,經(jīng)過我的不懈努力,解決了部分,還有的現(xiàn)在不能解決,只能留著日后思考和解決了,例如簡化代碼,可視化調(diào)試。這次的程序設(shè)計(jì)也讓我意識到,
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 迷宮問題非遞歸求解--數(shù)據(jù)結(jié)構(gòu)c語言課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---迷宮求解
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)迷宮求解課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮求解
- 迷宮求解數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 迷宮求解數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮求解
- 迷宮求解數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)與算法----迷宮求解課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---迷宮問題求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--求解迷宮問題
- 迷宮求解數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)迷宮求解(代碼參數(shù))課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--迷宮
- 迷宮問題的求解數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計(jì)
評論
0/150
提交評論