版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p><b> 說 明 書</b></p><p> 學(xué) 院: 信息科學(xué)與工程學(xué)院 </p><p> 班 級(jí): 計(jì)算機(jī)科學(xué)與技術(shù) 2009級(jí)6班 </p><p> 完
2、成 人:姓 名: 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 2010年12月31日</p><p> 課 程 設(shè) 計(jì) 任 務(wù) 書</p><p> 一、課程設(shè)計(jì)題目: 迷宮問題
3、 </p><p> 二、課程設(shè)計(jì)應(yīng)解決的主要問題:</p><p> ?。?) 實(shí)現(xiàn)一個(gè)以鏈表做存儲(chǔ)結(jié)構(gòu)的隊(duì)列類型; </p><p> ?。?) 編寫一個(gè)求解迷宮的非遞歸程序; </p><p> (3) 求得的通路以二元組的形式輸出,
4、寫清楚第幾步 </p><p> ?。?) 以方陣的形式輸出迷宮及其通路 </p><p> 三、任務(wù)發(fā)出日期: 2010-9-20 課程設(shè)計(jì)完成日期: 2011-01-07 </p><p><b> 小組分工說明</b></p><p&g
5、t; 小組編號(hào) 43 題 目: 迷宮問題 </p><p> 小組分工情況:獨(dú)自一人完成題目要求</p><p> 組長簽字: </p><p> 年 月 日</p><p> 指導(dǎo)教師對(duì)課程
6、設(shè)計(jì)的評(píng)價(jià)</p><p> 成績: </p><p> 指導(dǎo)教師簽字: </p><p> 年 月 日 </p><p><b> 目 錄</b></p><p> 需求分析說明 …………………………………
7、………51.1求迷宮通路的總體功能要求………………………………51.2主函數(shù)模塊……………………………………………………51.3隊(duì)列的存儲(chǔ)功能及輸出結(jié)點(diǎn)功能…………………………51.4構(gòu)建迷宮找出迷宮的通路…………………………………5</p><p> 1.5 測(cè)試數(shù)據(jù)…………………………………………………………………………..6</p><p> 概要設(shè)計(jì)說明 …………………
8、…………………………………62.1 模板的調(diào)用說明………………………………………………62.2 隊(duì)列的抽象數(shù)據(jù)類型定義…………………………………62.3 基本操作及函數(shù)功能………………………………………6</p><p> 詳細(xì)設(shè)計(jì)說明 ……………………………………………………73.1 主函數(shù)模塊…………………………………………………73.2 隊(duì)列的存儲(chǔ)功能及輸出結(jié)點(diǎn)功能………………………73.3
9、構(gòu)建迷宮找出迷宮的通路…………………………………8</p><p> 調(diào)試分析 …………………………………………………………8</p><p> 用戶使用說明 ……………………………………………………8</p><p> 5.1程序運(yùn)行的初始界面………………………………………………….......9</p><p> 5.2迷宮可通時(shí)
10、的界面……………………………………………………….10</p><p> 5.3迷宮不可通時(shí)的界面………………………………………………….11</p><p> 5.4迷宮沒有入口時(shí)的界面……………………………………………...12</p><p> 6課程設(shè)計(jì)總結(jié) ……………………………………………………12</p><p> 7測(cè)
11、試結(jié)果 ……………………………………………….13</p><p> 8參考書目………………………………………………..13</p><p> 9程序代碼………………………………………………..14</p><p><b> 需求分析說明</b></p><p> 求迷宮通路的總體功能要求:</p>
12、<p> 求迷宮中從入口到出口的所有路徑。由于計(jì)算機(jī)解迷宮時(shí)通常用的是“窮舉求解”的方法,即從入中出發(fā),順某一方向向前探索,若能走通,則繼續(xù)往前走否則沿原路退回,換一個(gè)方向再繼續(xù)探索,直至所有可能 的通路都探索到為止。</p><p><b> 基本功能如下:</b></p><p> ?、?界面友好,易于操作。利用提示完成走出迷宮的任務(wù)。</p
13、><p> ⑵ 實(shí)現(xiàn)以鏈表作存儲(chǔ)結(jié)構(gòu)的隊(duì)列類型。</p><p> ⑶ 實(shí)現(xiàn)建立一個(gè)隨機(jī)的迷宮,并且走出迷宮的操作。</p><p> 以下是各功能模塊的功能描述:</p><p><b> 1.主函數(shù)模塊</b></p><p> 本模塊的主要功能是初始化圖形界面,調(diào)用各模塊,實(shí)現(xiàn)走出迷宮
14、的功能。</p><p> 2.隊(duì)列的存儲(chǔ)功能及輸出結(jié)點(diǎn)功能</p><p> 本模塊的主要功能是建立隊(duì)列,實(shí)現(xiàn)隊(duì)列的各個(gè)基本操作,如構(gòu)建一個(gè)空隊(duì)列,往隊(duì)尾插入元素,刪除隊(duì)頭元素,取隊(duì)尾元素,取隊(duì)頭元素,判斷隊(duì)列是否為空,遍歷隊(duì)鏈的每個(gè)元素,輸出每個(gè)元素,銷毀隊(duì)鏈。</p><p> 3.構(gòu)建迷宮找出迷宮的通路</p><p> 本模
15、塊的主要功能是隨機(jī)初始化一個(gè)迷宮并輸出,實(shí)現(xiàn)走出迷宮的操作,再輸出走完后的迷宮及走出迷宮所走的路徑。</p><p><b> 測(cè)試數(shù)據(jù)</b></p><p> 1. (1,5) (4,8)</p><p> 2. (0,0) (9,9)</p><p> 3. (11,11)(11,11)</p>
16、<p><b> 概要設(shè)計(jì)說明</b></p><p><b> 模板調(diào)用說明:</b></p><p> 隊(duì)列的抽象數(shù)據(jù)類型定義為:</p><p> ADT Queue{</p><p> 數(shù)據(jù)對(duì)象: D={Ai | Ai ∈ElemSet,i=1,2,…,n, n&g
17、t;=0}數(shù)據(jù)關(guān)系:R1={<Ai-1,Ai>|Ai-1,Ai∈D,i=1,2,…,n}}</p><p> 約定其中a1端為隊(duì)列頭,an端為隊(duì)列尾。</p><p><b> 基本操作:</b></p><p> Status InitQueue (LinkQueue &Q)//構(gòu)造一個(gè)空隊(duì)列Q,隊(duì)列有一個(gè)頭結(jié)點(diǎn)&
18、lt;/p><p> Status DestroyQueue(LinkQueue &Q) //銷毀隊(duì)列Q</p><p> Status EnQueue(LinkQueue &Q,QElemType e)//插入元素e為Q的新的隊(duì)尾元素</p><p> Status DeQueue(LinkQueue &Q,QElemType
19、&e)//若隊(duì)列不空,則刪除Q的對(duì)頭元素,用e返回其值,并返回OK;否則返回ERROR</p><p> Status GetHead(LinkQueue Q,QElemType &e)//若隊(duì)列不空,則用e返回Q的隊(duì)頭元素,并返回OK;否則返回ERROR</p><p> Status GetRear(LinkQueue Q,QElemType &e)//若隊(duì)
20、列不空,則用e返回Q的隊(duì)尾元素,并返回OK;否則返回ERROR</p><p> Status DeRear(LinkQueue &Q,QElemType &e)//若隊(duì)列不空,利用循環(huán)彈出Q的隊(duì)尾元素,并返回OK;否則返回ERROR</p><p> Status QueueEmpty(LinkQueue Q)//若隊(duì)列Q為空隊(duì)列,則返回TURE,否則返回FALSE&
21、lt;/p><p> Status QueueTraverse(LinkQueue Q,Status (*visit)(QElemType))//從隊(duì)頭到隊(duì)尾依次對(duì)隊(duì)列Q中每個(gè)元素調(diào)用函數(shù)visit()。一旦visit失敗,則操作失敗</p><p> Status PrintQElem (QElemType e)//輸出隊(duì)列中的元素</p><p> Statu
22、s MakeMaze(MazeType &maze)//生成迷宮,"0"表示通PATH,"1"表示不通WALL</p><p> void PrintMaze(MazeType maze)//把迷宮輸出</p><p> PosType Nextpos(PosType position,ElemType direction)移動(dòng)到下一格,
23、向下走一步</p><p> StatusPassMaze(MazeType&maze,PosTypestart,PosTypeend,LinkQueue &Q)//找出迷宮的一條通路</p><p> void main()//主函數(shù),調(diào)用各個(gè)子函數(shù)</p><p><b> 詳細(xì)設(shè)計(jì)說明</b></p>
24、<p><b> 1.主函數(shù)模塊</b></p><p> 首先調(diào)用InitQueue函數(shù),構(gòu)造一個(gè)空隊(duì)列,然后調(diào)用MakeMaze函數(shù),隨機(jī)生成一個(gè)迷宮,再調(diào)用PrintMaze函數(shù),讓迷宮顯示在屏幕上,讓用戶輸入迷宮的入口和出口,再調(diào)用PassMaze,判斷迷宮是否有通路,如有則輸出迷宮可通及所走路徑。如沒有則輸出迷宮不可通及所走路徑。最后銷毀隊(duì)列,退出程序。</p&
25、gt;<p> 2.隊(duì)列的存儲(chǔ)功能及輸出結(jié)點(diǎn)功能</p><p> 在實(shí)現(xiàn)隊(duì)列的存儲(chǔ)功能時(shí),首先定義單鏈隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),然后定義隊(duì)列的各種基本操作的函數(shù),其中定義的函數(shù)有構(gòu)造一個(gè)空隊(duì)列的函數(shù)InitQueue,銷毀隊(duì)列的函數(shù)DestroyQueue,向隊(duì)尾插入元素的函數(shù)EnQueue,刪除隊(duì)頭元素的函數(shù)DeQueue,取隊(duì)頭元素的函數(shù)GetHead,利用循環(huán)彈出隊(duì)尾元素的函數(shù)DeRear,判
26、斷隊(duì)列是否為空的函數(shù)QueueEmpty。</p><p> 在實(shí)現(xiàn)輸出隊(duì)列的結(jié)點(diǎn)功能時(shí),定義了從隊(duì)頭到隊(duì)尾依次對(duì)隊(duì)列中每個(gè)元素調(diào)用函數(shù)visit()的遍歷函數(shù)QueueTraverse,及輸出隊(duì)列元素的輸出函數(shù)PrintQElem。</p><p> 3.構(gòu)建迷宮找出迷宮的通路</p><p> 在實(shí)現(xiàn)構(gòu)建迷宮的功能中,利用srand(time(NULL))
27、使計(jì)算機(jī)自動(dòng)讀取自己的時(shí)鐘獲得SEED值,獲得真正的隨機(jī)數(shù),利用循環(huán)調(diào)用函數(shù)rand()再對(duì)2取余,只獲得數(shù)0和1也就是迷宮中的墻和通路,再調(diào)用函數(shù)PrintQElem輸出初始迷宮。調(diào)用函數(shù)Nextpos,找通路的時(shí)候向前走一步,再調(diào)用函數(shù)PassMaze,找出迷宮的一條通路。 </p><p><b> 調(diào)試分析</b></p><p> 我在調(diào)試程序的過程中遇
28、到的問題是當(dāng)迷宮的路可通時(shí),輸出的所走路徑是亂碼,主要問題是如果判斷出一個(gè)通道塊不可通時(shí),已經(jīng)把它放入隊(duì)列當(dāng)中,如果再把它彈出時(shí)不能像棧那個(gè)樣直接調(diào)用出棧函數(shù),因?yàn)闂J窍冗M(jìn)后出的存儲(chǔ)結(jié)構(gòu),最新壓入的元素就能直接取出,而對(duì)于隊(duì)列來說新入隊(duì)的元素放在了隊(duì)尾,而出隊(duì)函數(shù)是把隊(duì)頭元素給輸出,不是新入隊(duì)的元素。因此,如果要用隊(duì)列模擬棧的功能,要解決的問題是,從隊(duì)頭開始依次將隊(duì)列的隊(duì)頭元素給輸出,再把該元素放入隊(duì)列當(dāng)中,只到遇到新插入的元素,只把它
29、彈出,就是把那個(gè)不可通的通道給彈出了,再往后退一步。修改過這個(gè)地方之后當(dāng)路徑可通時(shí),輸出的所走路徑就不是亂碼而是真正所走的通道塊坐標(biāo)。</p><p><b> 用戶使用說明</b></p><p> 編譯程序,出現(xiàn)有迷宮的界面,如下圖1所示,按提示輸入迷宮的入口位置坐標(biāo)和出口位置坐標(biāo),再運(yùn)行程序。如果迷宮有通路會(huì)輸出“迷宮可通,路徑蹤跡如下:”,輸出走過之后的迷
30、宮,然后再輸出具體路徑,如下圖2所示。如果迷宮不可通時(shí),會(huì)輸出“迷宮不可通,路徑蹤跡如下:”,輸出走過之后的迷宮,如下圖3所示。如果迷宮沒有入口時(shí),會(huì)輸出“當(dāng)前迷宮沒有入口”,“迷宮不可通,路徑蹤跡如下:”輸出迷宮,如下圖4所示。</p><p> 程序運(yùn)行的初始界面:</p><p><b> 圖1</b></p><p><b&g
31、t; 迷宮可通時(shí)的界面:</b></p><p><b> 圖2</b></p><p> 迷宮不可通時(shí)的界面:</p><p><b> 圖3</b></p><p> 迷宮沒有入口時(shí)的界面:</p><p><b> 圖4</b&g
32、t;</p><p><b> 課程設(shè)計(jì)總結(jié)</b></p><p> 通過這次的課程設(shè)計(jì)作業(yè),讓我真正的知道了棧的先進(jìn)后出的存儲(chǔ)結(jié)構(gòu)特點(diǎn)和隊(duì)列的先進(jìn)先出的存儲(chǔ)結(jié)構(gòu)特點(diǎn)的區(qū)別,而做迷宮求解的問題當(dāng)中最好用的存儲(chǔ)結(jié)構(gòu)是棧,如果用隊(duì)列做為存儲(chǔ)結(jié)構(gòu),就要利用循環(huán)來讓隊(duì)列模擬棧的先進(jìn)后出的存儲(chǔ)結(jié)構(gòu)特點(diǎn)。</p><p> 還讓我知道了用計(jì)算機(jī)求解
33、迷宮時(shí),用的是“窮舉求解”的方法,即從入中出發(fā),順某一方向向前探索,若能走通,則繼續(xù)往前走;否則沿原路退回,換一個(gè)方向再繼續(xù)探索,直至所有可能的通路都探索到為止。為了保證在任何位置上都能沿原路退回,顯然需要用一個(gè)后進(jìn)先出的結(jié)構(gòu)來保存從入口到當(dāng)前位置的路徑。因此,在求迷宮通路的算法中最好是應(yīng)用“?!?,如果要用“隊(duì)列”的話,就要用隊(duì)列來模擬棧的存儲(chǔ)結(jié)構(gòu)特點(diǎn)。</p><p><b> 測(cè)試結(jié)果</b
34、></p><p> 輸入(0,0)到(9,9)時(shí),輸出結(jié)果為:“當(dāng)前迷宮沒有入口”,“迷宮不可通,路徑蹤跡如下:”并輸出迷宮。</p><p> 輸入(11,11)到(11,11)時(shí),輸出結(jié)果為:“當(dāng)前迷宮沒有入口”,“迷宮不可通,路徑蹤跡如下:”并輸出迷宮。</p><p> 輸入(1,1)到(8,7)時(shí),輸出結(jié)果為:“迷宮可通,路徑蹤跡如下:”并輸
35、出走過之后的迷宮及具體路徑。</p><p> 輸入(1,1)到(6,6)時(shí),輸出結(jié)果為:“迷宮不可通,路徑足跡如下:”并輸出走過之后的迷宮。</p><p><b> 參考書目</b></p><p> 數(shù)據(jù)結(jié)構(gòu)(C語言版)嚴(yán)蔚敏 吳偉民 清華大學(xué)出版社</p><p> 數(shù)據(jù)結(jié)構(gòu)題集(C語言版)嚴(yán)蔚敏 吳偉民
36、 米寧 清華大學(xué)出版社 </p><p><b> 程序代碼</b></p><p> #include<stdio.h></p><p> #include<malloc.h></p><p> #include<stdlib.h></p><p>
37、 #include<time.h></p><p> #include<math.h></p><p><b> //函數(shù)狀態(tài)碼定義</b></p><p> #define TRUE 1</p><p> #define FALSE 0</p>&
38、lt;p> #define OK 1</p><p> #define ERROR 0</p><p> #define INFEASIBLE -1</p><p> #define NULL 0 </p><p> //墻或通路及前進(jìn)方向符號(hào)定義</p><
39、p> #define WALL 0 //代表當(dāng)前格子是墻</p><p> #define PATH 1 //代表是通路且未走過</p><p> #define RIGHT -1 //代表是通路且從其向右走</p><p> #define DOWN -2 //代表是通路且從其向下走&l
40、t;/p><p> #define LEFT -3 //代表是通路且從其向左走</p><p> #define UP -4 //代表是通路且從其向上走</p><p> #define BACK -5 //代表是通路且從其后退一步</p><p> #define DESTINATION -
41、6 //代表當(dāng)前格子是通路且是目標(biāo)位置</p><p> typedef int MazeType[10][10]; //最外鑿初始化成墻,實(shí)際含8*8個(gè)格子</p><p> typedef int Status;</p><p> typedef int ElemType; //迷宮數(shù)組中的元素類型</p><p> //---
42、------單鏈隊(duì)列--隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)-----//</p><p> typedef struct</p><p><b> {</b></p><p><b> int x;</b></p><p><b> int y;</b></p><
43、p> }PosType;//迷宮中坐標(biāo)的位置</p><p> typedef struct{</p><p> int ord; //通道塊在路徑上的序號(hào)</p><p> PosType seat; //通道塊在迷宮中的坐標(biāo)位置</p><p>
44、 int di; //從此通道塊走向下一通道塊的方向</p><p> }QElemType; //隊(duì)列中元素類型</p><p> typedef struct QNode</p><p><b> {</b></p><p>
45、QElemType data;</p><p> struct QNode *next;</p><p> }QNode,*QueuePtr; //隊(duì)列結(jié)點(diǎn)</p><p> typedef struct</p><p><b> {</b></p><p> Queu
46、ePtr front; //隊(duì)頭指針</p><p> QueuePtr rear; //隊(duì)尾指針</p><p> }LinkQueue;</p><p> Status InitQueue (LinkQueue &Q) //構(gòu)造一個(gè)空隊(duì)列Q,隊(duì)列有一個(gè)頭結(jié)點(diǎn)</p><p><b> {&
47、lt;/b></p><p> Q.front=(QueuePtr)malloc(sizeof(QNode));</p><p> Q.rear=Q.front;</p><p> if(!Q.front) exit(OVERFLOW); //存儲(chǔ)分配失敗</p><p> Q.front->next=NULL;
48、</p><p> return OK;</p><p> }//InitQueue</p><p> Status DestroyQueue(LinkQueue &Q) //銷毀隊(duì)列Q</p><p><b> {</b></p><p> while(Q.front
49、)</p><p><b> {</b></p><p> Q.rear = Q.front->next;</p><p> free(Q.front);</p><p> Q.front = Q.rear;</p><p><b> }</b></p&
50、gt;<p> return OK;</p><p> }//DestroyQueue</p><p> Status EnQueue(LinkQueue &Q,QElemType e) //插入元素e為Q的新的對(duì)尾元素 </p><p><b> {</b></p><p&
51、gt; QueuePtr p;</p><p> p=(QueuePtr)malloc(sizeof(QNode));</p><p> if(!p) exit (OVERFLOW); //存儲(chǔ)分配失敗</p><p> p->data = e;</p><p> p->nex
52、t = NULL;</p><p> Q.rear ->next = p;</p><p> Q.rear = p;</p><p> return OK;</p><p> }//EnQueue</p><p> Status DeQueue(LinkQueue &Q,QElemType &a
53、mp;e) </p><p><b> {</b></p><p> //若隊(duì)列不空,則刪除Q的對(duì)頭元素,用e返回其值,并返回OK;否則返回ERROR</p><p> QueuePtr p;</p><p> if (Q.front == Q.rear ) return ERROR;</p>
54、;<p> p=Q.front ->next ;</p><p> e=p->data ;</p><p> Q.front ->next =p->next ;</p><p> if(Q.rear == p) //判斷刪除后隊(duì)列是否為空</p><p> Q.rear =Q.
55、front ; //隊(duì)列已為空</p><p><b> free (p);</b></p><p> return OK;</p><p> }//DeQueue</p><p> Status GetHead(LinkQueue Q,QElemType &e) </p>&
56、lt;p><b> { </b></p><p> //若隊(duì)列不空,則用e返回Q的隊(duì)頭元素,并返回OK;否則返回ERROR</p><p> QueuePtr p;</p><p> if(Q.rear ==Q.front ) return ERROR;</p><p> p=Q.front->
57、;next; </p><p> e=p->data ; //取隊(duì)頭元素</p><p> return OK;</p><p> }//GetHead</p><p> Status GetRear(LinkQueue Q,QElemType &e) </p><p><b&g
58、t; { </b></p><p> //若隊(duì)列不空,則用e返回Q的隊(duì)尾元素,并返回OK;否則返回ERROR</p><p> QueuePtr p;</p><p> if(Q.rear ==Q.front ) return ERROR;</p><p> p=Q.rear; </p><p
59、> e=p->data ; //取隊(duì)尾元素</p><p> return OK;</p><p> }//GetRear</p><p> Status DeRear(LinkQueue &Q,QElemType &e)</p><p> {//若隊(duì)列不空,利用循環(huán)彈出Q的隊(duì)尾元素,并返回OK;否
60、則返回ERROR</p><p> QueuePtr p;</p><p> if(Q.rear ==Q.front ) return ERROR;</p><p><b> p=Q.rear;</b></p><p> while(Q.front->next!=p)</p><p
61、><b> {</b></p><p> DeQueue(Q,e); //刪除隊(duì)頭元素</p><p> EnQueue(Q,e); //將刪除的隊(duì)頭元素插入隊(duì)尾</p><p><b> }</b></p><p> DeQueue(Q,e);
62、 //將原來的隊(duì)尾元素彈出,相當(dāng)于棧的功能</p><p> return OK;</p><p><b> }//DeRear</b></p><p> Status QueueEmpty(LinkQueue Q) </p><p><b> {</b>&l
63、t;/p><p> //若隊(duì)列Q為空隊(duì)列,則返回TURE,否則返回FALSE</p><p> if(Q.rear == Q.front ) </p><p> return TRUE;</p><p><b> else </b></p><p> return FALSE;<
64、;/p><p> }//QueueEmpty</p><p> Status QueueTraverse(LinkQueue Q,Status (*visit)(QElemType)) </p><p><b> {</b></p><p> //從隊(duì)頭到隊(duì)尾依次對(duì)隊(duì)列Q中每個(gè)元素調(diào)用函數(shù)visit()。一旦visi
65、t失敗,則操作失敗。</p><p> QueuePtr p=Q.front->next ;</p><p> if(Q.rear ==Q.front ) printf("空隊(duì)列\(zhòng)n");</p><p><b> else</b></p><p> while(p!=NULL )
66、</p><p><b> {</b></p><p> (*visit) (p->data );</p><p> p=p->next;</p><p><b> }</b></p><p> return OK;</p><p&g
67、t; }//QueueTraverse</p><p> Status PrintQElem (QElemType e){</p><p> printf("step:%d to (%d,%d)\n",e.ord,e.seat.x,e.seat.y);</p><p> return OK;</p><p> }
68、//PrintQElem</p><p> //------------------- 迷宮求解的具體算法 ------------------//</p><p> Status MakeMaze(MazeType &maze) </p><p><b> {</b></p><p>
69、 //生成迷宮,"0"表示通PATH,"1"表示不通WALL</p><p> PosType m;</p><p> srand(time(NULL)); //使計(jì)算機(jī)自動(dòng)讀取自己的時(shí)間獲得SEED值,獲得真正的隨機(jī)數(shù)</p><p> for(m.y=0;m.y<=9;m.y++)</p&
70、gt;<p><b> {</b></p><p> maze[0][m.y]=WALL;</p><p> maze[9][m.y]=WALL;</p><p><b> }</b></p><p> for(m.x=1;m.x<=8;m.x++)</p>
71、;<p><b> {</b></p><p> maze[m.x][0]=WALL;</p><p> maze[m.x][9]=WALL;</p><p><b> }</b></p><p> for(m.x=1;m.x<=8;m.x++)</p>
72、<p> for(m.y=1;m.y<=8;m.y++)</p><p> maze[m.x][m.y]=rand()%2;//隨機(jī)取到0到RAND_MAX之間的任何數(shù),對(duì)2取余是只產(chǎn)生0,1,就是迷宮中的墻和路</p><p> return OK;</p><p> }//MakeMaze</p><p> vo
73、id PrintMaze(MazeType maze)</p><p><b> {</b></p><p><b> //打印迷宮</b></p><p><b> int x,y;</b></p><p> printf(" ");</p&
74、gt;<p> for(x=0;x<=9;x++)</p><p><b> {</b></p><p> printf(" %d",x);</p><p><b> }</b></p><p> printf("\n");<
75、;/p><p> for(x=0;x<=9;x++)</p><p><b> {</b></p><p> printf("%d",x);</p><p> for(y=0;y<=9;y++)</p><p><b> {</b><
76、;/p><p> switch(maze[x][y])</p><p><b> {</b></p><p> case WALL:printf("■");break;</p><p> case PATH:printf(" ");break;</p><
77、p> case RIGHT:printf("→");break;</p><p> case DOWN: printf("↓");break;</p><p> case LEFT: printf("←");break;</p><p> case UP: printf("↑&q
78、uot;);break;</p><p> case BACK: printf("@ ");break;</p><p> case DESTINATION:printf("◎");break;</p><p> default:printf("error\n");exit(-1);</p>
79、;<p><b> }</b></p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> }//PrintMaze</p><p&g
80、t; PosType Nextpos(PosType position,ElemType direction)</p><p><b> {</b></p><p> //移動(dòng)到下一格,向下走一步</p><p> PosType result;</p><p> result=position;</p&
81、gt;<p> switch (direction)</p><p><b> {</b></p><p> case 1:result.y++;break; //向右走</p><p> case 2:result.x++;break; //向下走</p><p> case 3:res
82、ult.y--;break; //向左走</p><p> case 4:result.x--;break; //向上走</p><p><b> }</b></p><p> return result;</p><p> }//Nextpos</p><p> Status
83、PassMaze(MazeType &maze,PosType start,PosType end,LinkQueue &Q)</p><p><b> {</b></p><p> //找出迷宮的一條通路</p><p> PosType curpos; //迷宮中的坐標(biāo)</p><p>
84、 QElemType e;</p><p> int curstep=1;</p><p> curpos=start;</p><p> if(maze[curpos.x][curpos.y]!=PATH) </p><p><b> { </b></p><p> printf(&
85、quot;當(dāng)前迷宮沒有入口\n"); </p><p> return FALSE;</p><p><b> }</b></p><p><b> do{ </b></p><p> if(maze[curpos.x][curpos.y]==PATH) //當(dāng)前位置可通&
86、lt;/p><p><b> {</b></p><p> e.ord=curstep; //走過的第幾步</p><p> e.seat=curpos; //通道塊在迷宮中的坐標(biāo)</p><p> e.di=1; //將要往右走</p><p&g
87、t; EnQueue(Q,e); //將坐標(biāo)位置插入隊(duì)尾</p><p> if(curpos.x==end.x&&curpos.y==end.y)</p><p><b> {</b></p><p> maze[curpos.x][curpos.y]=DESTINATION; //走出迷宮</p&
88、gt;<p> return OK;</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> maze[curpos.x][curpos.y]=RIGHT;
89、 //標(biāo)志為從其向右走</p><p> curpos=Nextpos(curpos,1); //坐標(biāo)向右移動(dòng)下個(gè)格</p><p> curstep++;</p><p><b> }</b></p><p><b> }</b></p><p> else
90、 //當(dāng)前位置不通</p><p><b> {</b></p><p> GetRear(Q,e);//返回隊(duì)尾元素</p><p> while(!QueueEmpty(Q)&&e.di==4)</p><p><b> {</b></p>
91、<p> maze[e.seat.x][e.seat.y]=BACK; //標(biāo)志為后退一步</p><p> DeRear(Q,e); //將插入隊(duì)尾的元素彈出</p><p> curstep--;</p><p> if(QueueEmpty(Q)) break;</p><p> GetRe
92、ar(Q,e); //取隊(duì)尾元素 </p><p><b> }</b></p><p> if(e.di<4) //隊(duì)尾位置有其他方向可以選擇</p><p><b> { </b></p><p> DeRear(Q,e); //彈出隊(duì)尾
93、元素</p><p><b> e.di++; </b></p><p> EnQueue(Q,e); //將新結(jié)點(diǎn)插入隊(duì)尾</p><p> maze[e.seat.x][e.seat.y]=-e.di; //注意前進(jìn)方向蹤跡與e.di互為相反數(shù)</p><p> curpos=Nextpos(e.
94、seat,e.di);</p><p><b> }</b></p><p><b> }</b></p><p> }while(!QueueEmpty(Q));</p><p> return FALSE;</p><p> }//PassMaze</p&
95、gt;<p> void main(){</p><p> MazeType maze;</p><p> PosType start,end;</p><p> LinkQueue Q;</p><p> InitQueue(Q);</p><p> MakeMaze(maze);</
96、p><p> printf("初始迷宮為:\n");</p><p> PrintMaze(maze);</p><p> printf("輸入迷宮的入口位置坐標(biāo)從(0,0)到(9,9): ");</p><p> scanf("%d,%d",&start.x,&
97、start.y);</p><p> printf("輸入迷宮的出口位置坐標(biāo)從(0,0)到(9,9): ");</p><p> scanf("%d,%d",&end.x,&end.y);</p><p> if(PassMaze(maze,start,end,Q)) //找迷宮通路</p>
98、;<p><b> {</b></p><p> printf("迷宮可通,路徑蹤跡如下:\n");</p><p> PrintMaze(maze); //輸出走過之后的迷宮</p><p> printf("具體路徑為:\n");</p><p>
99、; QueueTraverse(Q,PrintQElem); //遍歷隊(duì)列的每個(gè)元素并輸出</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> printf("迷宮不可通,
100、路徑蹤跡如下:\n");</p><p> PrintMaze(maze);</p><p><b> }</b></p><p> DestroyQueue(Q); //銷毀隊(duì)列</p><p> printf("-------------輸入任意鍵結(jié)束---------------\
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(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è)計(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è)計(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ì)---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)迷宮問題課程設(shè)計(jì)報(bào)告
- 迷宮求解數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論