版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p><b> 設(shè)計(jì)說明書</b></p><p><b> 2012年3月2日</b></p><p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)評閱書</p><p> 注:指導(dǎo)教師成績60%,答辯成績40%,總成績合成后按
2、五級制記入。</p><p><b> 課程設(shè)計(jì)任務(wù)書</b></p><p> 2011—2012學(xué)年第二學(xué)期</p><p> 課程設(shè)計(jì)名稱: 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) </p><p> 設(shè) 計(jì) 題
3、 目: 迷宮問題求解 </p><p> 完 成 期 限:自 2012 年 2 月 20 日至 2012 年 3 月 2 日共 2 周 </p><p> 設(shè)計(jì)依據(jù)、要求及主要內(nèi)容(可另加附頁):</p><p><b&g
4、t; 設(shè)計(jì)要求:</b></p><p> 設(shè)計(jì)內(nèi)容:輸入一個(gè)任意大小的迷宮數(shù)據(jù),設(shè)置入口、出口及障礙,借助棧結(jié)構(gòu)求解走出迷宮的路徑并輸出。</p><p> 邏輯設(shè)計(jì):對問題描述中涉及的操作對象定義相應(yīng)的數(shù)據(jù)類型,并按照以數(shù)據(jù)結(jié)構(gòu)為中心的原則劃分模塊,定義主程序模塊和各抽象數(shù)據(jù)類型。邏輯設(shè)計(jì)的結(jié)果應(yīng)寫出每個(gè)抽象數(shù)據(jù)類型的定義(包括數(shù)據(jù)結(jié)構(gòu)的描述和每個(gè)基本操作的功能說明)
5、,各個(gè)主要模塊的算法,并畫出模塊之間的調(diào)用關(guān)系圖;</p><p> 詳細(xì)設(shè)計(jì):定義相應(yīng)的存儲結(jié)構(gòu)并寫出各函數(shù)的偽碼算法。在這個(gè)過程中,要綜合考慮系統(tǒng)功能,使得系統(tǒng)結(jié)構(gòu)清晰、合理、簡單和易于調(diào)試,抽象數(shù)據(jù)類型的實(shí)現(xiàn)盡可能做到數(shù)據(jù)封裝,基本操作的規(guī)格說明盡可能明確具體。詳細(xì)設(shè)計(jì)的結(jié)果是對數(shù)據(jù)結(jié)構(gòu)和基本操作做出進(jìn)一步的求精,寫出數(shù)據(jù)存儲結(jié)構(gòu)的類型定義,寫出函數(shù)形式的算法框架;</p><p>
6、; 程序編碼:把詳細(xì)設(shè)計(jì)的結(jié)果進(jìn)一步求精為程序設(shè)計(jì)語言程序。同時(shí)加入一些注解和斷言,使程序中邏輯概念清楚;</p><p> 程序調(diào)試與測試:采用自底向上,分模塊進(jìn)行,即先調(diào)試低層函數(shù)。能夠熟練掌握調(diào)試工具的各種功能,設(shè)計(jì)測試數(shù)據(jù)確定疑點(diǎn),通過修改程序來證實(shí)它或繞過它。調(diào)試正確后,認(rèn)真整理源程序及其注釋,形成格式和風(fēng)格良好的源程序清單和結(jié)果;</p><p> 結(jié)果分析:程序運(yùn)行結(jié)果
7、包括正確的輸入及其輸出結(jié)果和含有錯(cuò)誤的輸入及其輸出結(jié)果。算法的時(shí)間、空間復(fù)雜性分析;</p><p><b> 編寫課程設(shè)計(jì)報(bào)告;</b></p><p> 以上要求中前三個(gè)階段的任務(wù)完成后,先將設(shè)計(jì)說明數(shù)的草稿交指導(dǎo)老師面審,審查合格后方可進(jìn)入后續(xù)階段的工作。設(shè)計(jì)工作結(jié)束后,經(jīng)指導(dǎo)老師驗(yàn)收合格后將設(shè)計(jì)說明書打印裝訂,并進(jìn)行答辯。</p><p
8、> 指導(dǎo)教師(簽字): 教研室主任(簽字): </p><p> 批準(zhǔn)日期: 年 月 日</p><p><b> 摘 要</b></p><p> 由計(jì)算機(jī)解迷宮時(shí),通常用的是窮舉求解的方法,即從入口出發(fā),順某一方向向前探索,若能走通,則繼續(xù)
9、往前走;否則沿原路反回,換一個(gè)方向繼續(xù)探索,直至所有可行的通路都探索到為止。為了保證在任何位置上都能沿原路返回,顯然需要用一個(gè)后進(jìn)先出的結(jié)構(gòu)來保存從入口到當(dāng)前位置的路徑。顯然要用到棧。</p><p> 關(guān)鍵詞:迷宮;窮舉;棧; </p><p><b> 目 錄</b></p><p> 1 課題描述··
10、····································
11、3;···································1</p&
12、gt;<p> 2 問題分析和任務(wù)定義································
13、;······························2</p><p> 3 數(shù)據(jù)結(jié)構(gòu)分析·
14、;····································
15、83;······························ 3</p><p> 3.1存儲結(jié)構(gòu)·
16、;····································
17、83;··································3</p>
18、<p> 3.2算法描述·································
19、3;····································
20、183;·3</p><p> 4 流程圖 ·····························
21、3;···································6</p&
22、gt;<p> 5 程序編碼································
23、3;····································
24、183;···10</p><p> 6 程序測試與運(yùn)行過程··························
25、3;··································19</p>
26、<p> 6.1程序調(diào)試·································
27、3;····································19
28、</p><p> 6.2程序運(yùn)行過程·······························
29、183;··································19</p>
30、<p> 7 結(jié)果分析·································&
31、#183;····································
32、;···25</p><p> 總結(jié)·····························
33、····································
34、3;···········26</p><p> 參考文獻(xiàn)····················
35、83;····································&
36、#183;···············27</p><p><b> 1 課題描述</b></p><p> 本課程設(shè)計(jì)是解決迷宮求解的問題,從入口出發(fā),順某一方向向前探索,若能走通,則繼續(xù)往前走;否則沿原路退
37、回,換一個(gè)方向再繼續(xù)探索,直至所有可能的通路都探索到為止。為了保證在任何位置上都能沿原路退回,顯然需要用一個(gè)后進(jìn)先出的結(jié)構(gòu)來保存從入口到當(dāng)前位置的路徑。因此,在求迷宮通路的算法中要應(yīng)用“?!钡乃枷爰僭O(shè)“當(dāng)前位置”指的是“在搜索過程中的某一時(shí)刻所在圖中某個(gè)方塊位置”,則求迷宮中一條路徑的算法的基本思想是:若當(dāng)前位置“可通”,則納入“當(dāng)前路徑”,并繼續(xù)朝“下一位置”探索,即切換“下一位置”為“當(dāng)前位置”,如此重復(fù)直至到達(dá)出口;若當(dāng)前位置“不
38、可通”,則應(yīng)順著“來向”退回到“前一通道塊”,然后朝著除“來向”之外的其他方向繼續(xù)探索;若該通道塊的四周4個(gè)方塊均“不可通”,則應(yīng)從“當(dāng)前路徑”上刪除該通道塊。所謂“下一位置”指的是當(dāng)前位置四周4個(gè)方向(東、南、西、北)上相鄰的方塊。假設(shè)以棧S記錄“當(dāng)前路徑”,則棧頂中存放的是“當(dāng)前路徑上最后一個(gè)通道塊”。由此,“納入路徑”的操作即為“當(dāng)前位置入?!?;“從當(dāng)前路徑上刪除前一通道塊”的操作即為“出?!?。</p><p&
39、gt; 2 問題分析和任務(wù)定義</p><p> 根據(jù)課設(shè)題目要求,擬將整體程序分為四大模塊。以下是四個(gè)模塊的大體分析:</p><p> 1 建立迷宮:要建立迷宮首先就要建立存儲結(jié)構(gòu),這里我用數(shù)組的方式建立的。根據(jù)用戶輸入的迷宮的大?。ㄎ以O(shè)置的最大值為25可以根據(jù)要求調(diào)解);</p><p> 2 設(shè)置迷宮:這里將0設(shè)置圍墻,1是可以通過的路徑,-1是
40、不可以通過路徑,外墻是以設(shè)計(jì)好的,內(nèi)墻需要用戶來設(shè)置,障礙的難度可自行定義;</p><p> 3 尋找路徑:尋找路徑我設(shè)置了四個(gè)方向{0,1},{1,0},{0,-1},{-1,0}移動方向,依次為東南西北,首先向東走,若不成功則轉(zhuǎn)換方向,成功則繼續(xù)前進(jìn),將走過的路徑進(jìn)行標(biāo)記,然后存入棧中;</p><p> 4 輸出結(jié)果:輸出的結(jié)果分為兩種,一種是用戶建立的迷宮主要是讓用戶檢查是否
41、符合要求,第二種輸出的是尋找完后的路徑,路徑用1 2 3 4···來表示。</p><p> 3 數(shù)據(jù)結(jié)構(gòu)分析</p><p><b> 3.1存儲結(jié)構(gòu)</b></p><p> 定義一個(gè)整型數(shù)組PosType用來存儲行列的值。</p><p> typedef struct /
42、/ 棧的元素類型 </p><p><b> {</b></p><p> int ord; // 通道塊在路徑上的"序號" </p><p> PosType seat; // 通道塊在迷宮中的"坐標(biāo)位置" </p><p> int di; // 從此通道塊走向下一通道塊的"方向"(0~3表示東~北) <
43、;/p><p> }SElemType; </p><p><b> 棧的存儲結(jié)構(gòu):</b></p><p> #define STACK_INIT_SIZE 10// 存儲空間初始分配量 </p><p> #define STACKINCREMENT 2// 存儲空間分配增量 </p><
44、p> // 棧的順序存儲表示 </p><p> typedef struct SqStack</p><p><b> {</b></p><p> SElemType *base;// 在棧構(gòu)造之前和銷毀之后,base的值為NULL </p><p> SElemType *top;// 棧頂指
45、針 </p><p> int stacksize;// 當(dāng)前已分配的存儲空間,以元素為單位 </p><p> }SqStack;// 順序棧</p><p><b> 3.2算法描述</b></p><p> 1.棧的基本操作的算法,簡單算法說明如下:</p><p> Sta
46、tus InitStack(SqStack *S)</p><p> {//構(gòu)造一個(gè)空棧S,為棧底分配一個(gè)指定大小的存儲空間</p><p> (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));</p><p> if( !(*S).base ) exit(0);
47、</p><p> (*S).top = (*S).base;// 棧底與棧頂相同表示一個(gè)空棧</p><p> (*S).stacksize = STACK_INIT_SIZE;</p><p><b> return 1;</b></p><p><b> }</b></p>
48、;<p> Status StackEmpty(SqStack S)</p><p> { // 若棧S為空棧(棧頂與棧底相同的),則返回1,否則返回0。</p><p> if(S.top == S.base) return 1;</p><p> else return 0;</p>&l
49、t;p> }Status Push(SqStack *S, SElemType e)</p><p> {//插入元素e為新的棧頂元素。</p><p> if((*S).top - (*S).base >= (*S).stacksize) {// 棧滿,追加存儲空間</p><p> (*S).base = (SElemType *)re
50、alloc((*S).base , ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));</p><p> if( !(*S).base ) exit(0);</p><p> (*S).top = (*S).base+(*S).stacksize;</p><p> (*S).stacksize
51、 += STACKINCREMENT;</p><p><b> }</b></p><p> *((*S).top)++=e;</p><p><b> return 1;</b></p><p><b> }</b></p><p> S
52、tatus Pop(SqStack *S,SElemType *e)</p><p> {//若棧不空,則刪除S的棧頂元素,用e返回其值,并返回1;否則返回0。</p><p> if((*S).top == (*S).base) return 0;</p><p> *e = *--(*S).top;</p><p><
53、;b> return 1;</b></p><p><b> }</b></p><p> 查找路徑的算法,簡單算法說明如下:</p><p> Status MazePath(PosType start,PosType end) </p><p> { // 若迷宮maze中存在從入口st
54、art到出口end的通道,則求得一條 </p><p> // 存放在棧中(從棧底到棧頂),并返回1;否則返回0 </p><p> InitStack(&S); curpos=start; curstep=1;</p><p><b> do</b></p><p><b> {<
55、;/b></p><p> if(Pass(curpos)){// 當(dāng)前位置可以通過,即是未曾走到過的通道塊 </p><p> FootPrint(curpos); // 留下足跡 </p><p> e =( curstep, curpos,1);</p><p> Push(&S,e); // 入棧當(dāng)前位置及狀態(tài)
56、</p><p> if(curpos.x==end.x&&curpos.y==end.y) // 到達(dá)終點(diǎn)(出口) </p><p><b> return 1;</b></p><p> curpos=NextPos(curpos,e.di);</p><p><b> }</
57、b></p><p> else{// 當(dāng)前位置不能通過 </p><p> if(!StackEmpty(S)){</p><p> Pop(&S,&e); // 退棧到前一位置 </p><p> curstep--; // 前一位置處于最后一個(gè)方向(北) </p><p> wh
58、ile(e.di==3&&!StackEmpty(S))</p><p><b> {</b></p><p> MarkPrint(e.seat); Pop(&S,&e); //留下不能通過的標(biāo)記(-1) , 退回一步</p><p><b> }</b></p>&l
59、t;p> if(e.di<3) { // 沒到最后一個(gè)方向(北) </p><p> e.di++; Push(&S,e);// 換下一個(gè)方向探索</p><p> curpos=NextPos(e.seat,e.di); // 設(shè)定當(dāng)前位置是該新方向上的相鄰塊</p><p><b> }</b></p>
60、;<p><b> }</b></p><p><b> }</b></p><p> }while(!StackEmpty(S));</p><p><b> return 0;</b></p><p><b> }</b><
61、;/p><p><b> 4. 流程圖</b></p><p> 4.1建立迷宮 構(gòu)造空棧函數(shù)并判斷,若是則建立迷宮,否則返回并構(gòu)造空棧。</p><p><b> n</b></p><p><b> y</b></p><p> 圖3.1建
62、立迷宮函數(shù)流程圖</p><p> 4.2設(shè)置迷宮 先設(shè)置迷宮障礙和起點(diǎn)與終點(diǎn)坐標(biāo),障礙設(shè)為0,用printf函數(shù)輸出</p><p> 圖3.2設(shè)置迷宮函數(shù)的流程圖</p><p> 4.3尋找路徑 先輸入起點(diǎn)與終點(diǎn)坐標(biāo)。判斷,若能通過則留下足跡,入棧,足跡加一并繼續(xù)判斷,若不能,則換方向繼續(xù)判斷。</p><p><b>
63、 N</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> Y</b></p><p><b> N</b></p><p> 圖3.3尋找路徑函數(shù)流程
64、圖</p><p><b> 4.4輸出結(jié)果</b></p><p> 圖3.4輸出結(jié)果流程圖</p><p><b> 5 程序編碼</b></p><p> #include<stdio.h></p><p> #include<stdl
65、ib.h></p><p> #include<string.h></p><p> #include<malloc.h></p><p> // 迷宮坐標(biāo)位置類型</p><p> typedef struct </p><p><b> {</b>&l
66、t;/p><p> int x;// 行值 </p><p> int y;// 列值 </p><p><b> }PosType;</b></p><p> #define MAXLENGTH 25 // 設(shè)迷宮的最大行列為25 </p><p> typedef int Maz
67、eType[MAXLENGTH][MAXLENGTH]; // 迷宮數(shù)組[行][列] </p><p> typedef struct // 棧的元素類型 </p><p><b> {</b></p><p> int ord; // 通道塊在路徑上的"序號" </p><p> PosType seat; /
68、/ 通道塊在迷宮中的"坐標(biāo)位置" </p><p> int di; // 從此通道塊走向下一通道塊的"方向"(0~3表示東~北) </p><p> }SElemType;</p><p><b> // 全局變量 </b></p><p> MazeType m; // 迷宮數(shù)組</p><
69、;p> int curstep=1; // 當(dāng)前足跡,初值為1 </p><p> #define STACK_INIT_SIZE 10// 存儲空間初始分配量 </p><p> #define STACKINCREMENT 2// 存儲空間分配增量 </p><p> // 棧的順序存儲表示 </p><p> typ
70、edef struct SqStack</p><p><b> {</b></p><p> SElemType *base;// 在棧構(gòu)造之前和銷毀之后,base的值為NULL </p><p> SElemType *top;// 棧頂指針 </p><p> int stacksize;// 當(dāng)
71、前已分配的存儲空間,以元素為單位 </p><p> }SqStack;// 順序棧</p><p> //構(gòu)造一個(gè)空棧S</p><p> int InitStack(SqStack *S)</p><p><b> {</b></p><p> // 為棧底分配一個(gè)指定大小的存儲
72、空間</p><p> (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));</p><p> if( !(*S).base )</p><p><b> exit(0);</b></p><p> (*S).top = (*S).
73、base;// 棧底與棧頂相同表示一個(gè)空棧</p><p> (*S).stacksize = STACK_INIT_SIZE;</p><p><b> return 1;</b></p><p><b> }</b></p><p> // 若棧S為空棧(棧頂與棧底相同的),則返回1,
74、否則返回0。</p><p> int StackEmpty(SqStack S)</p><p><b> {</b></p><p> if(S.top == S.base)</p><p><b> return 1;</b></p><p><b>
75、 else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> //插入元素e為新的棧頂元素。</p><p> int Push(SqStack *S, SElemType e)</p><
76、;p><b> {</b></p><p> if((*S).top - (*S).base >= (*S).stacksize)// 棧滿,追加存儲空間</p><p><b> {</b></p><p> (*S).base = (SElemType *)realloc((*S).base ,
77、</p><p> ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));</p><p> if( !(*S).base )</p><p><b> exit(0);</b></p><p> (*S).top = (*S).base+(*S).stac
78、ksize;</p><p> (*S).stacksize += STACKINCREMENT;</p><p><b> }</b></p><p> *((*S).top)++=e;</p><p><b> return 1;</b></p><p><
79、;b> }</b></p><p> //若棧不空,則刪除S的棧頂元素,用e返回其值,并返回1;否則返回0。</p><p> int Pop(SqStack *S,SElemType *e)</p><p><b> {</b></p><p> if((*S).top == (*S).b
80、ase)</p><p><b> return 0;</b></p><p> *e = *--(*S).top; // 這個(gè)等式的++ * 優(yōu)先級相同,但是它們的運(yùn)算方式,是自右向左</p><p><b> return 1;</b></p><p><b> }<
81、/b></p><p> // 定義墻元素值為0,可通過路徑為1,不能通過路徑為-1,通過路徑為足跡</p><p> // 當(dāng)迷宮m的b點(diǎn)的序號為1(可通過路徑),return 1; 否則,return 0。</p><p> int Pass(PosType b)</p><p><b> { </b>
82、</p><p> if(m[b.x][b.y]==1)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b>
83、 }</b></p><p> void FootPrint(PosType a) // 使迷宮m的a點(diǎn)的序號變?yōu)樽阚E(curstep),表示經(jīng)過</p><p><b> {</b></p><p> m[a.x][a.y]=curstep;</p><p><b> }</
84、b></p><p> // 根據(jù)當(dāng)前位置及移動方向,返回下一位置 </p><p> PosType NextPos(PosType c,int di)</p><p><b> {</b></p><p> PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; //
85、 {行增量,列增量} </p><p> // 移動方向,依次為東南西北 </p><p> c.x+=direc[di].x;</p><p> c.y+=direc[di].y;</p><p><b> return c;</b></p><p><b> }</b
86、></p><p> // 使迷宮m的b點(diǎn)的序號變?yōu)?1(不能通過的路徑)</p><p> void MarkPrint(PosType b)</p><p><b> { </b></p><p> m[b.x][b.y]=-1;</p><p><b> }<
87、/b></p><p> // 若迷宮maze中存在從入口start到出口end的通道,則求得一條 </p><p> // 存放在棧中(從棧底到棧頂),并返回1;否則返回0 </p><p> int MazePath(PosType start,PosType end) </p><p><b> { </
88、b></p><p> SqStack S;</p><p> PosType curpos;</p><p> SElemType e;</p><p> InitStack(&S);</p><p> curpos=start;</p><p><b>
89、do</b></p><p><b> {</b></p><p> if(Pass(curpos))</p><p> {// 當(dāng)前位置可以通過,即是未曾走到過的通道塊 </p><p> FootPrint(curpos); // 留下足跡 </p><p> e.ord
90、=curstep;</p><p> e.seat.x=curpos.x;</p><p> e.seat.y=curpos.y;</p><p><b> e.di=0;</b></p><p> Push(&S,e); // 入棧當(dāng)前位置及狀態(tài) </p><p> curst
91、ep++; // 足跡加1 </p><p> if(curpos.x==end.x&&curpos.y==end.y) // 到達(dá)終點(diǎn)(出口) </p><p><b> return 1;</b></p><p> curpos=NextPos(curpos,e.di);</p><p><
92、;b> }</b></p><p><b> else</b></p><p> {// 當(dāng)前位置不能通過 </p><p> if(!StackEmpty(S))</p><p><b> {</b></p><p> Pop(&S,&
93、amp;e); // 退棧到前一位置 </p><p> curstep--;</p><p> while(e.di==3&&!StackEmpty(S)) // 前一位置處于最后一個(gè)方向(北)</p><p><b> {</b></p><p> MarkPrint(e.seat); //
94、留下不能通過的標(biāo)記(-1) </p><p> Pop(&S,&e); // 退回一步 </p><p> curstep--;</p><p><b> }</b></p><p> if(e.di<3) // 沒到最后一個(gè)方向(北) </p><p><b&
95、gt; {</b></p><p> e.di++; // 換下一個(gè)方向探索</p><p> Push(&S,e); curstep++;// 設(shè)定當(dāng)前位置是該新方向上的相鄰塊</p><p> curpos=NextPos(e.seat,e.di);</p><p><b> }</b>
96、</p><p><b> }</b></p><p><b> }</b></p><p> }while(!StackEmpty(S));</p><p><b> return 0;</b></p><p><b> }<
97、/b></p><p> // 輸出迷宮的結(jié)構(gòu) </p><p> void Print(int x,int y)</p><p><b> { </b></p><p><b> int i,j;</b></p><p> for(i=0;i<x;i+
98、+)</p><p><b> {</b></p><p> for(j=0;j<y;j++)</p><p> printf("%3d",m[i][j]);</p><p> printf("\n");</p><p><b>
99、}</b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> PosType begin,end;</p><p> int i,j,x,y,x1,y1,n,k;<
100、;/p><p><b> do{</b></p><p> system("cls"); //清屏函數(shù)</p><p> printf(" <<<<&l
101、t;<<<<<<<<<<<welcome>>>>>>>>>>>>>>>> \n\n\n");</p><p> printf(" 1請輸入迷宮的行數(shù),列數(shù)(包括外墻)\
102、n");</p><p> printf(" 2請輸入迷宮內(nèi)墻單元數(shù)\n");</p><p> printf(" 3迷宮結(jié)構(gòu)如下\n");</p><p> printf("
103、 4輸入迷宮的起點(diǎn)和終點(diǎn)\n");</p><p> printf(" 5輸出結(jié)果\n");</p><p> printf(" 0退出\n");</p><p> printf
104、("\n\n請選擇 ");</p><p> scanf("%d",&n);</p><p><b> switch(n)</b></p><p><b> {</b></p><p><b> case 1:{</b>
105、;</p><p> printf("請輸入迷宮的行數(shù),列數(shù)(包括外墻):(空格隔開)");</p><p> scanf("%d%d", &x, &y);</p><p> for(i=0;i<x;i++) // 定義周邊值為0(同墻) </p><p><b>
106、 {</b></p><p> m[0][i]=0;// 迷宮上面行的周邊即上邊墻 </p><p> m[x-1][i]=0;// 迷宮下面行的周邊即下邊墻 </p><p><b> }</b></p><p> for(j=1;j<y-1;j++)</p><p&g
107、t;<b> {</b></p><p> m[j][0]=0;// 迷宮左邊列的周邊即左邊墻 </p><p> m[j][y-1]=0;// 迷宮右邊列的周邊即右邊墻 </p><p><b> }</b></p><p> for(i=1;i<x-1;i++)</p&g
108、t;<p> for(j=1;j<y-1;j++)</p><p> m[i][j]=1; // 定義通道初值為1 </p><p><b> }break; </b></p><p><b> case 2:</b></p><p> {printf("請
109、輸入迷宮內(nèi)墻單元數(shù):");</p><p> scanf("%d",&j);</p><p> printf("請依次輸入迷宮內(nèi)墻每個(gè)單元的行數(shù),列數(shù):(空格隔開)\n");</p><p> for(i=1;i<=j;i++)</p><p><b> {&l
110、t;/b></p><p> scanf("%d%d",&x1,&y1);</p><p> m[x1][y1]=0; </p><p><b> }</b></p><p><b> }break;</b></p><p>
111、; case 3:{Print(x,y);printf("輸入0退出");scanf("%d",&k);}break;</p><p> case 4:{ printf("請輸入起點(diǎn)的行數(shù),列數(shù):(空格隔開)");</p><p> scanf("%d%d",&begin.x,&
112、begin.y);</p><p> printf("請輸入終點(diǎn)的行數(shù),列數(shù):(空格隔開)");</p><p> scanf("%d%d",&end.x,&end.y);}break;</p><p><b> case 5:{</b></p><p>
113、 if(MazePath(begin,end)) // 求得一條通路 </p><p><b> {</b></p><p> printf("此迷宮從入口到出口的一條路徑如下:\n");</p><p> Print(x,y); // 輸出此通路 </p><p><b> }&l
114、t;/b></p><p><b> else</b></p><p> printf("此迷宮沒有從入口到出口的路徑\n");</p><p> printf("輸入0退出");scanf("%d",&k);</p><p><b&g
115、t; }break;</b></p><p><b> }</b></p><p> }while(n!=0);}</p><p> 6 程序測試與運(yùn)行</p><p><b> 6.1 程序調(diào)試</b></p><p> 在調(diào)試程序是主要遇到一
116、下幾類問題:</p><p> 1.選擇存儲結(jié)構(gòu)的問題:剛接到課設(shè)題目的時(shí)候,我就在想用什么來實(shí)現(xiàn)迷宮的存儲。用線性表還是數(shù)組,最后綜合考慮決定用棧和數(shù)組結(jié)合的方式來實(shí)現(xiàn),用數(shù)組來建立迷宮和輸出迷宮,用棧來查找路徑并將生成的路徑壓入到棧中,因?yàn)闂S邢热牒蟪龅膬?yōu)點(diǎn),所以比較容易實(shí)現(xiàn)。</p><p> 2.如何建立迷宮和怎么設(shè)置迷宮的問題:首先迷宮要有一定的范圍怎么才能讓迷宮有序的進(jìn)行,
117、于是我將迷宮的外圍和障礙設(shè)置為0,所有的可走路徑設(shè)置為1,這樣迷宮就清晰可見。</p><p> 3.如何去尋找路徑問題 :這是整個(gè)程序的核心。通過查找書籍得到了一個(gè)算法:若當(dāng)前位置“可通”,則納入當(dāng)前路徑,并繼續(xù)朝下一位置搜索,即切換下一位置為當(dāng)前位置,如此重復(fù)到達(dá)出口;若不可通,就退回到前一通道,然后繼續(xù)尋找其他方向;若均不可通,則刪除此路徑。</p><p> 4界面問題:這里就
118、是運(yùn)用了switch(n)語句來實(shí)現(xiàn)的,這樣增加了程序的實(shí)用性。</p><p><b> 6.2程序運(yùn)行過程</b></p><p> 出現(xiàn)界面后選擇1,:進(jìn)行迷宮大小的設(shè)計(jì)如圖5.1所示</p><p> 圖5.1 進(jìn)行迷宮大小的設(shè)計(jì)</p><p> 選擇2,開始設(shè)計(jì)迷宮的內(nèi)部:如圖5.2所示</p
119、><p> 圖5.2設(shè)計(jì)迷宮的內(nèi)部</p><p> 觀察設(shè)計(jì)的是否滿足你的要求:如圖 5.3所示</p><p> 圖5.3觀察設(shè)計(jì)的是否滿足你的要求</p><p> 輸入迷宮的起點(diǎn)和終點(diǎn):如圖5.4所示(見下頁)</p><p> 圖5.4輸入起點(diǎn)和終點(diǎn)</p><p> 選擇5,
120、查看結(jié)果(路徑由1.2.3.4.5表示出來):如圖5.5所示</p><p><b> 圖5.5查看結(jié)果</b></p><p> 無通路情況。如圖5.6、5.7所示(見下頁)</p><p><b> 圖5.6無通路情況</b></p><p><b> 圖5.7無通路情況<
121、;/b></p><p> 有多條通路的情況,如圖5.8 5.9 5.10所示(見下頁)</p><p> 圖5.8多條通路的情況</p><p> 圖5.9多條通路的情況</p><p> 圖5.10多條通路的情況</p><p> 之所以程序選擇這條通路,是因?yàn)樗剿鞯捻樞蚴菛|-南-西-北。<
122、/p><p><b> 7 結(jié)果分析</b></p><p> 通過此次課程設(shè)計(jì),是我對于數(shù)據(jù)結(jié)構(gòu)有了更深的了解,更新的認(rèn)識。數(shù)據(jù)結(jié)構(gòu)是一門重要的課程,只有數(shù)據(jù)結(jié)構(gòu)學(xué)得扎實(shí)了,才能對于計(jì)算機(jī)有更深的應(yīng)用,所以學(xué)好數(shù)據(jù)結(jié)構(gòu)是很重要的。經(jīng)過兩周的上機(jī)設(shè)計(jì),我實(shí)現(xiàn)了簡單的迷宮求解,能夠簡單的實(shí)現(xiàn)求解過程。但是還存在著不足之處,程序不能循環(huán)執(zhí)行、求路徑時(shí)遇見有多條路徑的情
123、況下,只能找出一條,并且不一定是最優(yōu)路徑。有待改進(jìn)。</p><p><b> 總結(jié)</b></p><p> 本次課程設(shè)計(jì)是一個(gè)關(guān)于迷宮求解的問題,雖然剛聽到有一些迷茫但是通過老師和同學(xué)的幫助最后還是有了結(jié)果,同時(shí)有了很多的體會和經(jīng)驗(yàn)。</p><p> 課程設(shè)計(jì)涉及很多的范圍,這就需要我重新的溫習(xí)以前學(xué)過的C語言的知識和數(shù)據(jù)結(jié)構(gòu)的算法
124、,別且通過這個(gè)過程我又發(fā)現(xiàn)了我自身的不足,同時(shí)也鞏固了我的C語言和數(shù)據(jù)結(jié)構(gòu)。這對我以后的學(xué)習(xí)是非常有幫助的。</p><p> 但在運(yùn)行測試的時(shí)候,我發(fā)現(xiàn)程序不能循環(huán)輸入,多通路下只能選擇一條通路。在進(jìn)行最優(yōu)路徑搜索時(shí),我查閱了資料,知道要運(yùn)用圖與隊(duì)列的相關(guān)知識,但試了很多次沒有試出來。這都需要以后進(jìn)行不斷的學(xué)習(xí)來改進(jìn)。</p><p><b> 參考文獻(xiàn)</b>
125、</p><p> 嚴(yán)蔚敏. 數(shù)據(jù)結(jié)構(gòu)(C語言版)[M]. 北京:清華大學(xué)出版社,1997.</p><p> 譚浩強(qiáng). C程序設(shè)計(jì)(第三版)[M]. 北京:清華大學(xué)出版社,2005.1. </p><p> 二霍紅衛(wèi)算法設(shè)計(jì)與分析〔」西安西安電子科技大學(xué)出版社,2005.113-127.</p><p> 陳杰.計(jì)算機(jī)專業(yè)課程設(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)課程設(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ì)報(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ù))課程設(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ì)-迷宮問題
評論
0/150
提交評論