![數(shù)據(jù)結(jié)構(gòu)迷宮問(wèn)題實(shí)驗(yàn)報(bào)告_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/22/74c3e9e4-8904-417a-9481-17bd1cc67f5f/74c3e9e4-8904-417a-9481-17bd1cc67f5f1.gif)
![數(shù)據(jù)結(jié)構(gòu)迷宮問(wèn)題實(shí)驗(yàn)報(bào)告_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/22/74c3e9e4-8904-417a-9481-17bd1cc67f5f/74c3e9e4-8904-417a-9481-17bd1cc67f5f2.gif)
![數(shù)據(jù)結(jié)構(gòu)迷宮問(wèn)題實(shí)驗(yàn)報(bào)告_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/22/74c3e9e4-8904-417a-9481-17bd1cc67f5f/74c3e9e4-8904-417a-9481-17bd1cc67f5f3.gif)
![數(shù)據(jù)結(jié)構(gòu)迷宮問(wèn)題實(shí)驗(yàn)報(bào)告_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/22/74c3e9e4-8904-417a-9481-17bd1cc67f5f/74c3e9e4-8904-417a-9481-17bd1cc67f5f4.gif)
![數(shù)據(jù)結(jié)構(gòu)迷宮問(wèn)題實(shí)驗(yàn)報(bào)告_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/22/74c3e9e4-8904-417a-9481-17bd1cc67f5f/74c3e9e4-8904-417a-9481-17bd1cc67f5f5.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ì)迷宮問(wèn)題實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)二專業(yè):物聯(lián)網(wǎng)工程班級(jí):物聯(lián)網(wǎng)1班學(xué)號(hào):15180118姓名:劉沛航一、 實(shí)驗(yàn)?zāi)康? 本程序是利用非遞歸的方法求出一條走出迷宮的路徑,并將路徑輸出。首先由用戶輸入一組二維數(shù)組來(lái)組成迷宮,確認(rèn)后程序自動(dòng)運(yùn)行,當(dāng)迷宮有完整路徑可以通過(guò)時(shí),以0和1所組成的迷宮形式輸出,標(biāo)記所走過(guò)的路徑結(jié)束程序;當(dāng)迷宮無(wú)路徑時(shí),提示輸入錯(cuò)誤結(jié)束程序。二、實(shí)驗(yàn)內(nèi)容 用一個(gè)m*m長(zhǎng)方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設(shè)計(jì)一個(gè)程序?qū)τ谌我庠O(shè)定的迷宮,求出一條從入口到出口
2、的通路,或得出沒(méi)有通路的結(jié)論。三、程序設(shè)計(jì) 1、概要設(shè)計(jì)(1) 設(shè)定棧的抽象數(shù)據(jù)類型定義 ADT Stack數(shù)據(jù)對(duì)象:D=ai|ai屬于CharSet,i=1、2n,n>=0數(shù)據(jù)關(guān)系:R=<ai-1,ai>|ai-1,ai屬于D,i=2,3,n基本操作: InitStack(&S)
3、0; 操作結(jié)果:構(gòu)造一個(gè)空棧 Push(&S,e) 初始條件:棧已經(jīng)存在
4、; 操作結(jié)果:將e所指向的數(shù)據(jù)加入到棧s中 Pop(&S,&e) 初始條件:棧已經(jīng)存在
5、 操作結(jié)果:若棧不為空,用e返回棧頂元素,并刪除棧頂元素 Getpop(&S,&e) 初始條件:棧已經(jīng)存在
6、160; 操作結(jié)果:若棧不為空,用e返回棧頂元 StackEmpty(&S) 初始條件:棧已經(jīng)存在
7、0; 操作結(jié)果:判斷棧是否為空。若棧為空,返回1,否則返回0 Destroy(&S) 初始條件:棧已經(jīng)存在
8、 操作結(jié)果:銷毀棧sADT Stack(2)設(shè)定迷宮的抽象數(shù)據(jù)類型定義ADT yanshu數(shù)據(jù)對(duì)象:D=ai,j|ai,j屬于 、*、#,0<=i<=M,0<=j<=N數(shù)據(jù)關(guān)系:R=ROW,COL ROW=<ai-1,j,ai,j>|ai-1,j,ai,j屬于D,i=1,2,M,j=0,1,
9、N COL=<ai,j-1,ai,j>|ai,j-1,ai,j屬于D,i=0,1,M,j=1,2,N基本操作:InitMaze(MazeType &maze, int aCOL, int row, int col)初始條件:二維數(shù)組int aCOL,已經(jīng)存在,其中第1至第m-1行,每行自第1到第n-1列的元素已經(jīng)值,并以值0表示障礙,值1表示通路。操作結(jié)果:構(gòu)造迷宮的整形數(shù)組,以空白表示通路,字符0表示障礙
10、160; 在迷宮四周加上一圈障礙 MazePath(&maze) 初始條件:迷宮maze已被賦值
11、; 操作結(jié)果:若迷宮maze中存在一條通路,則按如下規(guī)定改變maze的狀態(tài);以字符*表示路徑上的位置。字符表示死胡同;否則迷宮的狀態(tài)不變PrintMaze(M)初始條件:迷宮M已存在操作結(jié)果:以字符形式輸出迷宮 ADTmaze(3)本程序包括三個(gè)模塊a、 主程序模塊void mai
12、n()初始化;構(gòu)造迷宮;迷宮求解;迷宮輸出;b、 棧模塊實(shí)現(xiàn)棧的抽象數(shù)據(jù)類型c、 迷宮模塊實(shí)現(xiàn)迷宮的抽象數(shù)據(jù)類型2、詳細(xì)設(shè)計(jì) (1)坐標(biāo)位置類型: typedef struct int row; /迷宮中的行 int col; /.的列PosType;/坐標(biāo)
13、60; (2) 迷宮類型:typedef struct
14、; int m,n; int arrRANGERANGE;MazeType; /迷宮類型void InitMaze(MazeType &maze, int aCOL, int row, int col)/設(shè)置迷宮的初值,包括邊緣一圈的值Bool MazePath(MazeType &maze,PosType start, PosType end)/求
15、解迷宮maze中,從入口start到出口end的一條路徑/若存在,則返回true,否則返回falseVoid PrintMaze(MazeType maze)/將迷宮打印出來(lái)(3) 棧類型:typedef struct int step; /當(dāng)前位置在路徑上的"序號(hào)" PosType
16、60; seat; /當(dāng)前的坐標(biāo)位置 DirectiveType di; /往下一個(gè)坐標(biāo)位置的方向SElemType;/棧的元素類型 typedef struct SElemType *base; SElemType *top;
17、160; int stacksize;SqStack;棧的基本操作設(shè)置如下:Void InitStack(SqStack & S)/初始化,設(shè)S為空棧(S.top=NUL)Void DestroyStack(Stack &S)/銷毀棧S,并釋放空間Void ClearStack(SqStack & S)/將棧S清空Int StackLength(SqStack &S)/返回棧S的長(zhǎng)度Status StackEmpty(SqStack &S)?、若S為空棧(S.top=NULL),則返回TRUE,否則返回FALSEStat
18、ue GetTop(SqStack &S,SElemType e)/r若棧S不空,則以e待會(huì)棧頂元素并返回TRUE,否則返回FALSEStatue Pop(SqStack&S,SElemType e)/若分配空間成功,則在S的棧頂插入新的棧頂元素s并返回TRUE/否則棧不變,并返回FALSEStatue Push(SqStack&S,SElemType &e)/若分配空間程控,則刪除棧頂并以e帶回其值,則返回TRUE/否則返回FALSEVoid StackTraverse(SqStack &S,Status)(*Visit)(SElemType e)/從
19、棧頂依次對(duì)S中的每個(gè)節(jié)點(diǎn)調(diào)用函數(shù)Visit4求迷宮路徑的偽碼算法:Status MazePath(MazeType &maze,PosType start, PosType end) /求解迷宮maze中,從入口start到出口end的一條路徑 InitStack(s); PosType curpos = start; int curstep = 1;
20、160; /探索第一部 do if( Pass(maze,curpos) ) /如果當(dāng)前位置可以通過(guò),即是未曾走到的通道塊 FootPrint(maze,curpos);
21、0; /留下足跡 e = CreateSElem(curstep,curpos,1); /創(chuàng)建元素 Push(s,e);
22、0; if( PosEquare(curpos,end) ) return TRUE; curpos =NextPos(curpos,1); /獲得下一節(jié)點(diǎn):當(dāng)前位
23、置的東鄰 curstep+; /探索下一步
24、; else /當(dāng)前位置不能通過(guò) if(!StackEmpty(s)
25、; Pop(s,e); while(e.di=4 && !StackEmpty(s) )
26、0; MarkPrint(maze,e.seat); Pop(s,e); /留下不能通過(guò)的標(biāo)記,并退回步 if(e.di<4)
27、60; e.di+; Push(s,e); /換一個(gè)方向探索
28、160; curpos = NextPos(e.seat,e.di); /設(shè)定當(dāng)前位置是該方向上的相塊 /if /if
29、; /else while(!StackEmpty(s); return FALSE;/MazePath四、程序調(diào)試分析 1.首先呢,想自己讀入數(shù)據(jù)的,回來(lái)發(fā)現(xiàn)那樣,很麻煩,所以還是事先定義一個(gè)迷宮。2.棧的元素類型 一開(kāi)始有點(diǎn)迷惑,后來(lái)就解決了3.本題中三個(gè)主要算法;InitMaze,MazePath和PrintMaze的時(shí)間復(fù)雜度均為O(m*n)本題的空間復(fù)雜度也是O(m*n)五、用戶使用說(shuō)明 1本程序運(yùn)行在windows系列的操作系統(tǒng)下,執(zhí)行文件為:Maze_Test.exe
30、。六、程序運(yùn)行結(jié)果1.建立迷宮:2通過(guò)1功能建立8*8的迷宮后,通過(guò)2功能繼續(xù)建立迷宮內(nèi)部:通過(guò)建立自己設(shè)定單元數(shù)目建立迷宮內(nèi)墻。3通過(guò)3功能觀察已建立的迷宮結(jié)構(gòu):4通過(guò)4功能確立迷宮起點(diǎn)和終點(diǎn):(此處像我們隨機(jī)選擇4,4和2,7分別為起點(diǎn)終點(diǎn))5執(zhí)行5功能,判斷是否有路徑走出迷宮:這種情況無(wú)法走出迷宮。我們?cè)俅斡^察圖像設(shè)4,4和1,6分別為起點(diǎn)終點(diǎn),再運(yùn)行5功能。觀察到可以成功解開(kāi)迷宮步數(shù)從1依次開(kāi)始。七、程序清單#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.
31、h>/ 迷宮坐標(biāo)位置類型typedef struct int x;/ 行值 int y;/ 列值 PosType;#define MAXLENGTH 25 / 設(shè)迷宮的最大行列為25 typedef int MazeTypeMAXLENGTHMAXLENGTH; / 迷宮數(shù)組行列 typedef struct / 棧的元素類型 int ord; / 通道塊在路徑上的序號(hào) PosType seat; / 通道塊在迷宮中的坐標(biāo)位置 int di; / 從此通道塊走向下一通道塊的方向(03表示東北) SElemType;/ 全局變量 MazeType m; / 迷宮數(shù)組 int curstep
32、=1; / 當(dāng)前足跡,初值為1 #define STACK_INIT_SIZE 10/ 存儲(chǔ)空間初始分配量 #define STACKINCREMENT 2/ 存儲(chǔ)空間分配增量 / 棧的順序存儲(chǔ)表示 typedef struct SqStackSElemType *base;/ 在棧構(gòu)造之前和銷毀之后,base的值為NULL SElemType *top;/ 棧頂指針 int stacksize;/ 當(dāng)前已分配的存儲(chǔ)空間,以元素為單位 SqStack;/ 順序棧/構(gòu)造一個(gè)空棧Sint InitStack(SqStack *S)/ 為棧底分配一個(gè)指定大小的存儲(chǔ)空間(*S).base = (SEl
33、emType *)malloc(STACK_INIT_SIZE*sizeof(SElemType);if( !(*S).base )exit(0);(*S).top = (*S).base;/ 棧底與棧頂相同表示一個(gè)空棧(*S).stacksize = STACK_INIT_SIZE;return 1;/ 若棧S為空棧(棧頂與棧底相同的),則返回1,否則返回0。int StackEmpty(SqStack S)if(S.top = S.base)return 1;elsereturn 0;/插入元素e為新的棧頂元素。int Push(SqStack *S, SElemType e)if(*S)
34、.top - (*S).base >= (*S).stacksize)/ 棧滿,追加存儲(chǔ)空間(*S).base = (SElemType *)realloc(*S).base , (*S).stacksize + STACKINCREMENT) * sizeof(SElemType);if( !(*S).base )exit(0);(*S).top = (*S).base+(*S).stacksize;(*S).stacksize += STACKINCREMENT;*(*S).top)+=e;return 1;/若棧不空,則刪除S的棧頂元素,用e返回其值,并返回1;否則返回0。int
35、Pop(SqStack *S,SElemType *e)if(*S).top = (*S).base)return 0;*e = *-(*S).top; / 這個(gè)等式的+ * 優(yōu)先級(jí)相同,但是它們的運(yùn)算方式,是自右向左return 1;/ 定義墻元素值為0,可通過(guò)路徑為1,不能通過(guò)路徑為-1,通過(guò)路徑為足跡/ 當(dāng)迷宮m的b點(diǎn)的序號(hào)為1(可通過(guò)路徑),return 1; 否則,return 0。int Pass(PosType b) if(mb.xb.y=1)return 1;elsereturn 0;void FootPrint(PosType a) / 使迷宮m的a點(diǎn)的序號(hào)變?yōu)樽阚E(curs
36、tep),表示經(jīng)過(guò)ma.xa.y=curstep;/ 根據(jù)當(dāng)前位置及移動(dòng)方向,返回下一位置 PosType NextPos(PosType c,int di)PosType direc4=0,1,1,0,0,-1,-1,0; / 行增量,列增量 / 移動(dòng)方向,依次為東南西北 c.x+=direcdi.x;c.y+=direcdi.y;return c;/ 使迷宮m的b點(diǎn)的序號(hào)變?yōu)?1(不能通過(guò)的路徑)void MarkPrint(PosType b) mb.xb.y=-1;/ 若迷宮maze中存在從入口start到出口end的通道,則求得一條 / 存放在棧中(從棧底到棧頂),并返回1;否則返回
37、0 int MazePath(PosType start,PosType end) SqStack S;PosType curpos;SElemType e;InitStack(&S);curpos=start;doif(Pass(curpos)/ 當(dāng)前位置可以通過(guò),即是未曾走到過(guò)的通道塊 FootPrint(curpos); / 留下足跡 e.ord=curstep;e.seat.x=curpos.x;e.seat.y=curpos.y;e.di=0;Push(&S,e); / 入棧當(dāng)前位置及狀態(tài) curstep+; / 足跡加1 if(curpos.x=end.x&
38、&curpos.y=end.y) / 到達(dá)終點(diǎn)(出口) return 1;curpos=NextPos(curpos,e.di);else/ 當(dāng)前位置不能通過(guò) if(!StackEmpty(S)Pop(&S,&e); / 退棧到前一位置 curstep-;while(e.di=3&&!StackEmpty(S) / 前一位置處于最后一個(gè)方向(北)MarkPrint(e.seat); / 留下不能通過(guò)的標(biāo)記(-1) Pop(&S,&e); / 退回一步 curstep-;if(e.di<3) / 沒(méi)到最后一個(gè)方向(北) e.di+;
39、/ 換下一個(gè)方向探索Push(&S,e); curstep+;/ 設(shè)定當(dāng)前位置是該新方向上的相鄰塊curpos=NextPos(e.seat,e.di);while(!StackEmpty(S);return 0;/ 輸出迷宮的結(jié)構(gòu) void Print(int x,int y) int i,j;for(i=0;i<x;i+)for(j=0;j<y;j+)printf("%3d",mij);printf("n"); void main()PosType begin,end;int i,j,x,y,x1,y1,n,k;dosystem("cls"); /清屏函數(shù)printf("*物聯(lián)網(wǎng)1班-15
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 魯人版道德與法治九年級(jí)上冊(cè)11.1《合同是當(dāng)事人之間的法律》聽(tīng)課評(píng)課記錄
- 滬教版數(shù)學(xué)九年級(jí)下冊(cè)27.1《圓的基本性質(zhì)》聽(tīng)評(píng)課記錄
- 人教版地理七年級(jí)下冊(cè)第三節(jié)《撒哈拉以南的非洲》聽(tīng)課評(píng)課記錄1
- 人教版七年級(jí)數(shù)學(xué)下冊(cè) 聽(tīng)評(píng)課記錄5.1.3 第1課時(shí)《同位角、內(nèi)錯(cuò)角、同旁內(nèi)角》
- 蘇科版數(shù)學(xué)七年級(jí)下冊(cè)聽(tīng)評(píng)課記錄7.5多邊形的內(nèi)角和與外角和
- 聽(tīng)評(píng)課記錄表8篇二年級(jí)
- 【部編版】道德與法治九年級(jí)下冊(cè)2.1《推動(dòng)和平與發(fā)展》聽(tīng)課評(píng)課記錄
- 湘教版數(shù)學(xué)七年級(jí)下冊(cè)《相交直線所成的角》聽(tīng)評(píng)課記錄
- 生產(chǎn)計(jì)劃外包合同(2篇)
- 獨(dú)生子女合同
- 2024年步步高高考英語(yǔ)大一輪復(fù)習(xí)(新人教版)基礎(chǔ)知識(shí)默寫本必修第一冊(cè)含答案
- 盤錦市重點(diǎn)中學(xué)2024年中考英語(yǔ)全真模擬試卷含答案
- 2024年《幼兒教師職業(yè)道德》教案
- 平安產(chǎn)險(xiǎn)湖南省商業(yè)性雞蛋價(jià)格指數(shù)保險(xiǎn)條款
- 石家莊市第四十中學(xué)2021-2022學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試題
- 《共演戰(zhàn)略》分析工具
- 兒童行為發(fā)育評(píng)估量表(注意力、讀寫力、感知覺(jué)發(fā)展)
- 2023年煙花爆竹安全作業(yè)真題模擬匯編(共718題)
- 揚(yáng)州市古樹(shù)名木匯編
- 提高臥床患者踝泵運(yùn)動(dòng)的執(zhí)行率
- 裝配式建筑預(yù)制構(gòu)件運(yùn)輸與堆放-預(yù)制構(gòu)件運(yùn)輸基本要求
評(píng)論
0/150
提交評(píng)論