![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮問(wèn)題(2)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/b341b31a-e613-49e2-9ffd-da866901b64a/b341b31a-e613-49e2-9ffd-da866901b64a1.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮問(wèn)題(2)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/b341b31a-e613-49e2-9ffd-da866901b64a/b341b31a-e613-49e2-9ffd-da866901b64a2.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮問(wèn)題(2)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/b341b31a-e613-49e2-9ffd-da866901b64a/b341b31a-e613-49e2-9ffd-da866901b64a3.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮問(wèn)題(2)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/b341b31a-e613-49e2-9ffd-da866901b64a/b341b31a-e613-49e2-9ffd-da866901b64a4.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮問(wèn)題(2)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/b341b31a-e613-49e2-9ffd-da866901b64a/b341b31a-e613-49e2-9ffd-da866901b64a5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)課程名稱:數(shù)據(jù)結(jié)構(gòu)題目:迷宮設(shè)計(jì)系別:軟件學(xué)院專業(yè):移動(dòng)設(shè)備應(yīng)用開發(fā)班級(jí): 15 級(jí)移動(dòng) 1 班姓名:黃國(guó)峰學(xué)期:2016-2017第一學(xué)期指導(dǎo)教師:李博時(shí)間:2016 年 12月目錄第一部分需求分析第二部分詳細(xì)設(shè)計(jì)第三部分調(diào)試分析第四部分用戶手冊(cè)第五部分測(cè)試結(jié)果第六部分附錄第七部分參考文獻(xiàn)一、 需求分析1 、對(duì)于給定的一個(gè)迷宮,給出一個(gè)出口和入口,找一條從入口到出口的通路,并把這條通路顯示出來(lái);如果沒有找到這樣的通路給出沒有這樣通路的信息。2、可以用一個(gè)m n的長(zhǎng)方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設(shè)計(jì)一個(gè)程序,對(duì)任意設(shè)定的迷宮,求出一條從入口到出口的通路,或得出
2、沒有通路的結(jié)論。3、編寫一個(gè)求解迷宮的非遞歸程序。求得的通路以三元組(i , j , d) 的形式輸出,其中: (i , j) 指示迷宮中的一個(gè)坐標(biāo), d 表示走到下一坐標(biāo)的方向。4、手動(dòng)設(shè)置迷宮是任意給定的,所以程序要能夠?qū)o定的迷宮生成對(duì)應(yīng)的矩陣表示,所以程序的輸入包括了矩陣的行數(shù)、列數(shù)、迷宮內(nèi)墻的個(gè)數(shù)、迷宮內(nèi)墻的坐標(biāo)、所求的通路的入口坐標(biāo)、出口坐標(biāo)。5、自動(dòng)生成的迷宮原理很簡(jiǎn)單,因?yàn)? 和 1 分別代表通道和障礙物,所以只需要隨機(jī)生成0 和 1 然后再給最外圍都賦值為 1,就形成了新的迷宮。二、詳細(xì)設(shè)計(jì)1 、計(jì)算機(jī)解迷宮通常用的是“窮舉求解“方法,即從人口出發(fā),順著某一個(gè)方向進(jìn)行探索,若
3、能走通,則繼續(xù)往前進(jìn);否則沿著原路退回,換一個(gè)方向繼續(xù)探索,直至出口位置,求得一條通路。假如所有可能的通路都探索到而未能到達(dá)出口,則所設(shè)定的迷宮沒有通路??梢远S數(shù)組存儲(chǔ)迷宮數(shù)據(jù),通常設(shè)定入口點(diǎn)的下標(biāo)為 (1 , 1) ,出口點(diǎn)的下標(biāo)為 (n , n) 。為處理方便起見,可在迷宮的四周加一圈障礙。對(duì)于迷宮中任一位置,均可約定有東、南、西、北四個(gè)方向可通。2、如果在某個(gè)位置上四個(gè)方向都走不通的話,就退回到前一個(gè)位置,換一個(gè)方向再試,如果這個(gè)位置已經(jīng)沒有方向可試了就再退一步,如果所有已經(jīng)走過(guò)的位置的四個(gè)方向都試探過(guò)了,一直退到起始點(diǎn)都沒有走通,那就說(shuō)明這個(gè)迷宮根本不通。3、所謂 "走不通
4、 "不單是指遇到 "墻擋路 " ,還有 " 已經(jīng)走過(guò)的路不能重復(fù)走第二次 " ,它包括 " 曾經(jīng)走過(guò)而沒有走通的路" 。顯然為了保證在任何位置上都能沿原路退回, 需要用一個(gè)" 后進(jìn)先出 "的結(jié)構(gòu)即棧來(lái)保存從入口到當(dāng)前位置的路徑。并且在走出出口之后,棧中保存的正是一條從入口到出口的路徑。4、若當(dāng)前位置“可通” ,則納入“當(dāng)前路徑” ,并繼續(xù)朝“下一位置”探索;若當(dāng)前位置“不可通” ,則應(yīng)順著“來(lái)的方向”退回到“前一通道塊” ,然后朝著除“來(lái)向”之外的其他方向繼續(xù)探索;若該通道塊的四周四個(gè)方塊均“不可通” ,
5、則應(yīng)從“當(dāng)前路徑”上刪除該通道塊。所謂“下一位置”指的是“當(dāng)前位置”四周四個(gè)方向(東、南、西、北)上相鄰的方塊。假設(shè)以棧S 記錄“當(dāng)前路徑” ,則棧頂中存放的是“當(dāng)前路徑上最后一個(gè)通道塊” 。 由此, “納入路徑” 的操作即為 “當(dāng)前位置入棧” ;“從當(dāng)前路徑上刪除前一通道塊”的操作即為“出?!?。5、找通路的程序的關(guān)鍵部分可以表示如下:do若當(dāng)前位置可通,則將當(dāng)前位置插入棧頂; / 納入路徑若該位置是出口位置,則算法結(jié)束;/ 此時(shí)棧中存放的是一條從入口位置到出口位置的路徑否則切換當(dāng)前位置的東鄰方塊為新的當(dāng)前位置;否則若棧不空且棧頂位置尚有其他方向未被探索,則設(shè)定新的當(dāng)前位置為 : 沿順時(shí)針方
6、向旋轉(zhuǎn)找到的棧頂位置的下一相鄰塊;若棧不空但棧頂位置的四周均不可通,則 刪去棧頂位置; / 從路徑中刪去該通道塊若棧不空,則重新測(cè)試新的棧頂位置,直至找到一個(gè)可通的相鄰塊或出棧至??眨?while ( 棧不空 ) ;6 、程序中用的數(shù)據(jù)結(jié)構(gòu)解析: 程序中用了順序棧保存當(dāng)前找到的路徑,當(dāng)前位置不可通時(shí),可以出棧,退回到前一個(gè)位置再繼續(xù)探索通路,棧的定義如下:struct SqStackSElemType *base; / 在棧構(gòu)造之前和銷毀之后, base 的值為 NULLSElemType *top; / 棧頂指針int stacksize; / 當(dāng)前已分配的存儲(chǔ)空間,以元素為單位; / 順序
7、棧 棧中元素的類型結(jié)構(gòu)程序中先定義了一個(gè)表示坐標(biāo)的類型結(jié)構(gòu):struct PosType /迷宮坐標(biāo)位置類型int x; /行值int y; /列值;棧中元素的類型結(jié)構(gòu)如下:struct SElemType 棧的元素類型int ord; 通道塊在路徑上的序號(hào)PosType seat; 通道塊在迷宮中的坐標(biāo)位置int di; /從此通道塊走向下一通道塊的方向(03表示東;7、主函數(shù)的流程圖輸入迷宮的行數(shù)列數(shù)(包括外墻)設(shè)置外墻設(shè)置內(nèi)墻顯示當(dāng)前輸入所求通路的起點(diǎn)終點(diǎn)坐標(biāo)輸出沒有顯示當(dāng)前含有通路的迷宮結(jié)構(gòu)輸出從起點(diǎn)到終點(diǎn)的坐標(biāo)手動(dòng)設(shè)置自動(dòng)生三、調(diào)試分析1、對(duì)于程序的設(shè)計(jì)由簡(jiǎn)單到復(fù)雜,先設(shè)計(jì)一個(gè)整體的
8、輪廓然后再慢慢的增 加程序的功能,這樣能夠有效的減少錯(cuò)誤,功能慢慢的增加,在前一步的程 序運(yùn)行通過(guò)之后再繼續(xù)增加功能,這樣在檢查錯(cuò)誤的時(shí)候比較有目的性,提高寫程序的效率。2、對(duì)于程序中的錯(cuò)誤,如果遇到說(shuō)變量沒有定義或者數(shù)據(jù)結(jié)構(gòu)沒定義的錯(cuò)誤,可能是由于你在定義這種數(shù)據(jù)結(jié)構(gòu)的變量時(shí)數(shù)據(jù)結(jié)構(gòu)還沒有定義,也就是說(shuō)在定義此數(shù)據(jù)結(jié)構(gòu)的變量的語(yǔ)句要放在聲明這種結(jié)構(gòu)體之后。3、在寫程序時(shí)要注意printf 和 scanf 語(yǔ)句的格式,格式不對(duì)會(huì)得不到你想要的結(jié)果。4、寫程序時(shí)一定要瞻前顧后,前后一致,包括名稱、數(shù)據(jù)類型等等。四、用戶手冊(cè)在使用程序時(shí)嚴(yán)格按照程序給出的提示一步一步來(lái),下面給出程序正常執(zhí)行的步驟:
9、1、程序會(huì)提示“請(qǐng)輸入迷宮的行數(shù),列數(shù)(包括外墻) : ” ,這時(shí)就需要輸入表示迷宮的二維數(shù)組的行數(shù)和列數(shù), 需要注意的是由于我們?cè)诿詫m周圍加了一道墻,所以要輸入的行列數(shù)要比實(shí)際表示迷宮的行列數(shù)多兩行兩列。 、 程序提示 “請(qǐng)輸入迷宮內(nèi)墻單元數(shù): ” , 此時(shí)需要輸入迷宮中墻的數(shù)目。3、程序提示“請(qǐng)依次輸入迷宮內(nèi)墻每個(gè)單元的行數(shù),列數(shù):” ,此時(shí)要輸入迷宮中所有墻的坐標(biāo),我們用數(shù)組中的一個(gè)元素來(lái)表示墻。4、在輸入了迷宮所有內(nèi)墻的坐標(biāo)后,程序會(huì)顯示出迷宮的結(jié)構(gòu),然后程序會(huì)提示 “請(qǐng)輸入起點(diǎn)的行數(shù), 列數(shù): ” , 此時(shí)需要輸入所求通路的起點(diǎn)坐標(biāo)。5、程序提示“請(qǐng)輸入終點(diǎn)的行數(shù),列數(shù):” ,此時(shí)需
10、要輸入所求通路的終點(diǎn)的坐標(biāo)。6、終點(diǎn)坐標(biāo)輸入完畢之后,程序會(huì)顯示出兩種運(yùn)行的結(jié)果,一種是輸出了迷宮的結(jié)構(gòu),此時(shí)迷宮中已包含了所找的通路,用連續(xù)的數(shù)字表示出了通路在迷宮中是如何走的,此時(shí)迷宮中的-1表示找通路時(shí)走過(guò)的單元但是通路 不通。注意:再輸入內(nèi)墻單元的坐標(biāo)是一定要細(xì)心,不要錯(cuò)輸,也不要漏輸。否則程序會(huì)出錯(cuò)。五、測(cè)試結(jié)果 迷宮的測(cè)試數(shù)據(jù)如下:左上角(1 , 1)為入口,右下角(9, 8)為出口。1 2 3 4 5 6 7 8001000100010001000001101011100100001000001000101011110011100010111000000程序的測(cè)試結(jié)果為:1、 程
11、序的開始界面六、附錄(附有完整的源程序)源程序如下:#include <stdio.h>#include <stdlib.h># define TRUE 1# define FALSE 0# define OK 1# define ERROR 0# define OVERFLOW -2# define STACKINCREMENT 10# define STACK_INIT_SIZE 100/ 初始長(zhǎng)度 typedef int Status;struct PosType /坐標(biāo)豎直為x,橫為yint x;int y;struct SElemType int ord; /
12、 序號(hào) 1, 2, 3, 4, 5, 6 路徑的序號(hào)PosType seat; / 坐標(biāo)int di; / 移動(dòng)方向:上下左右;struct SqStack SElemType *base;SElemType *top;int stacksize;SqStack S;#define MAXLENGTH 30typedef int MazeTypeMAXLENGTHMAXLENGTH; / 將數(shù)組做成地圖。 MazeType m; / 宏定義,定義一個(gè)數(shù)組地圖int curstep=2; / curstep 代表的是足跡,走過(guò)的路Status InitStack(SqStack &S)
13、S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType);/ 開空間, 棧底是表頭if(!S.base) exit(OVERFLOW);/ 檢查是否開辟成功S.top=S.base;/ 設(shè)為空棧S.stacksize=STACK_INIT_SIZE;/ 設(shè)置長(zhǎng)度 return OK;Status Pop(SqStack &S,SElemType &e)/ 得到棧頂元素if(S.base=S.top) return ERROR;/ 檢查是否為空棧 ,若為空則沒有棧頂 e=*-S.top; /棧的特殊存儲(chǔ)方式retu
14、rn OK;Status StackEmpty(SqStack &S)/ 判斷是否為空 if(!S.base) return ERROR;if(S.base=S.top) return TRUE;/ 為空 else return FALSE;Status Push(SqStack &S,SElemType e)/ 進(jìn)棧if(S.top-S.base>=S.stacksize)/ 棧不滿 S.base=(SElemType *) realloc (S.base,(S.stacksize+STACKINCREMENT) * sizeof(SElemType);/ 開空間if(
15、!S.base) exit(OVERFLOW);/ 檢查是否開空間成功S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;/ 壓進(jìn)棧里面return OK;Status Pass(PosType a)/ 傳參傳的是當(dāng)前位置的坐標(biāo) / 檢查當(dāng)前位置是墻還是通道if(ma.xa.y=0)return OK; elsereturn ERROR;Status FootPrint(PosType a)/ 對(duì)已經(jīng)走過(guò)的路做成標(biāo)記1 , 2, 3, 4. 。ma.xa.y=curstep;PosType NextPos(PosType
16、 c,int di)/0-3 上下左右/ 作用是移動(dòng)一個(gè)位置,所以需要傳進(jìn)來(lái)位置,移動(dòng)方向,畢竟位移量已經(jīng)確定為 1PosType direc4=-1,0,1,0,0,-1,0,1;/上下左右c.x+=direcdi.x;c.y+=direcdi.y;return c;void MarkPrint(PosType a)/ 走不通ma.xa.y=-1;/ 此路不通void Print(int x,int y) /迷宮的輸出int i,j;for(i=0;i<x;i+)for(j=0;j<y;j+)if(mij=1)printf(" ");elseprintf(&q
17、uot; 匚"); printf("n");void Print1(int x,int y)/ 有通路的迷宮的輸出int i,j;for(i=0;i<x;i+)for(j=0;j<y;j+)if(mij=1) printf(" ");else if(mij=-1|mij=0)printf(" 匚 ");else if(mij>=2) printf(""); printf("n");Status MazePath(PosType start,PosType end)/
18、找通路InitStack(S);/ 保存可以走的路徑SElemType e;PosType curpos=start;/curpos 是指當(dāng)前位置,將開始位置設(shè)為當(dāng)前位置 doif(Pass(curpos)/ 如果當(dāng)前位置的序號(hào)為0,即此位置不是迷宮中的墻即為能走的路。 FootPrint(curpos);/ 留下標(biāo)記e.ord=curstep; / 輸出的時(shí)候的 1, 2, 3, 4, 5e.di=0;Push(S,e);/ 將這一步記錄,壓進(jìn)棧中curstep+; / 再走一步 和 ord 一個(gè)性質(zhì),路徑的步數(shù)if(curpos.x=end.x&&curpos.y=end.
19、y) return TRUE;/ 如果已經(jīng)是出口就完 成棧的記錄curpos=NextPos(curpos,e.di);/ 否則就 走一步else/ 如果當(dāng)前位置是走過(guò)得 意思就是它的 序號(hào)不是 0if(!StackEmpty(S)/ 判斷棧是不是空,不是空就后退到上一步Pop(S,e);/ 后退到上一步 curstep-;while(e.di=3&&!StackEmpty(S)/ 后退直到 找到能走的路 MarkPrint(e.seat);Pop(S,e); curstep-; if(e.di<3)/0 3代表上下左右e.di+;Push(S,e);curstep+;c
20、urpos=NextPos(e.seat,e.di);/ 下一步怎么移動(dòng)while(!StackEmpty(S);return FALSE;void Auto_maze(int x,int y)int i,j;printf("n 迷宮生成中nn");system("pause");for(i=0;i<x;i+)for(j=0;j<y;j+)mij=rand()%2;void GenerateMaze(int x,int y)/ 生成迷宮地圖int i,j;int x1,y1;/ 障礙物坐標(biāo)for(i=0;i<y;i+)m0i=1;mx-
21、1i=1;for(j=0;j<x;j+) mj0=1;mjy-1=1;for(i=1;i<x-1;i+)for(j=1;j<y-1;j+)mij=0;printf(" 輸入迷宮里面阻礙物的個(gè)數(shù):");scanf("%d",&j);printf(" 請(qǐng)輸入迷宮中障礙物坐標(biāo): n");for(i=0;i<j;i+)scanf("%d%d",&x1,&y1);mx1y1=1;printf("I*n");Print(x,y);printf("I*
22、迷宮圖迷宮圖*n");void Movingdirection(SElemType a)/ 用來(lái)顯示迷宮通路怎么走的switch(a.di)case 0:printf("%d%3dTbreak;case 1:printf("%d%3d break;case 2:printf("%d%3d break;case 3:printf("%d%3d break;void MazePathway(PosType begin,PosType end,int x,int y)/ 顯示迷宮通路圖 SElemType a;SqStack T;InitStack(
23、T);if(MazePath(begin,end)printf(" 迷宮通路如下圖所示:n");Print1(x,y);while(!StackEmpty(S)Pop(S,a);Push(T,a);printf(" 找到的路徑用坐標(biāo)表示如下 :n");while(!StackEmpty(T)Pop(T,a);Movingdirection(a); elseprintf(" 迷宮中沒有出路。 n");int main()PosType begin,end;int x,y;int n;int i,j;while(1) printf("*1.手動(dòng)輸入。*n");printf("*2.自動(dòng)生成。*n");printf("*3.退 出。*n");printf(" 請(qǐng)輸入: ")
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年買賣房屋協(xié)議書合同(2篇)
- 2025年代理銷售合同標(biāo)準(zhǔn)樣本(2篇)
- 2025年人才開發(fā)專項(xiàng)資金使用協(xié)議樣本(三篇)
- 2025年二手房屋買賣合同協(xié)議簡(jiǎn)單版(2篇)
- 地鐵站裝修工程合同范例
- 未來(lái)科技風(fēng)格裝修協(xié)議
- 智能家居產(chǎn)業(yè)居間存款協(xié)議
- 溫泉?jiǎng)e墅裝修設(shè)計(jì)服務(wù)協(xié)議
- 旅館裝修免租協(xié)議范例
- 光伏發(fā)電工程居間協(xié)議
- 2024年廣東省深圳市中考道德與法治試題卷
- 汽車車身密封條設(shè)計(jì)指南
- DB4101-T 121-2024 類家庭社會(huì)工作服務(wù)規(guī)范
- DB53∕T 1269-2024 改性磷石膏用于礦山廢棄地生態(tài)修復(fù)回填技術(shù)規(guī)范
- 【財(cái)務(wù)共享服務(wù)模式探究的文獻(xiàn)綜述4000字】
- 敬語(yǔ)專項(xiàng)練習(xí)-高考日語(yǔ)復(fù)習(xí)
- 2024建安杯信息通信建設(shè)行業(yè)安全競(jìng)賽題庫(kù)(試題含答案)
- JBT 14727-2023 滾動(dòng)軸承 零件黑色氧化處理 技術(shù)規(guī)范 (正式版)
- 術(shù)后譫妄及護(hù)理
- 手術(shù)室術(shù)中物品清點(diǎn)不清的應(yīng)急預(yù)案演練流程及劇本
- 醫(yī)藥行業(yè)的市場(chǎng)營(yíng)銷與渠道拓展
評(píng)論
0/150
提交評(píng)論