




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 目錄第一部分 需求分析第二部分 詳細設計第三部分 調試分析第四部分 用戶手冊第五部分 測試結果第六部分 附錄第七部分 參考文獻一、 需求分析 1、對于給定的一個迷宮,給出一個出口和入口,找一條從入口到出口的通路,并把這條通路顯示出來;如果沒有找到這樣的通路給出沒有這樣通路的信息。2、可以用一個mn的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計一個程序,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。3、編寫一個求解迷宮的非遞歸程序。求得的通路以三元組(i,j,d)的形式輸出,其中:(i,j)指示迷宮中的一個坐標,d表示走到下一坐標的方向。4、由于迷宮是任意給定的
2、,所以程序要能夠對給定的迷宮生成對應的矩陣表示,所以程序的輸入包括了矩陣的行數、列數、迷宮內墻的個數、迷宮內墻的坐標、所求的通路的入口坐標、出口坐標。二、詳細設計 1、計算機解迷宮通常用的是“窮舉求解“方法,即從人口出發,順著某一個方向進行探索,若能走通,則繼續往前進;否則沿著原路退回,換一個方向繼續探索,直至出口位置,求得一條通路。假如所有可能的通路都探索到而未能到達出口,則所設定的迷宮沒有通路。可以二維數組存儲迷宮數據,通常設定入口點的下標為(1,1),出口點的下標為(n,n)。為處理方便起見,可在迷宮的四周加一圈障礙。對于迷宮中任一位置,均可約定有東、南、西、北四個方向可通。2、如果在某
3、個位置上四個方向都走不通的話,就退回到前一個位置,換一個方向再試,如果這個位置已經沒有方向可試了就再退一步,如果所有已經走過的位置的四個方向都試探過了,一直退到起始點都沒有走通,那就說明這個迷宮根本不通。3、所謂走不通不單是指遇到墻擋路,還有已經走過的路不能重復走第二次,它包括曾經走過而沒有走通的路。顯然為了保證在任何位置上都能沿原路退回,需要用一個后進先出的結構即棧來保存從入口到當前位置的路徑。并且在走出出口之后,棧中保存的正是一條從入口到出口的路徑。4、若當前位置“可通”,則納入“當前路徑”,并繼續朝“下一位置”探索;若當前位置“不可通”,則應順著“來的方向”退回到“前一通道塊”,然后朝著
4、除“來向”之外的其他方向繼續探索;若該通道塊的四周四個方塊均“不可通”,則應從“當前路徑”上刪除該通道塊。所謂“下一位置”指的是“當前位置”四周四個方向(東、南、西、北)上相鄰的方塊。假設以棧S記錄“當前路徑”,則棧頂中存放的是“當前路徑上最后一個通道塊”。由此,“納入路徑”的操作即為“當前位置入?!?;“從當前路徑上刪除前一通道塊”的操作即為“出?!?。5、找通路的程序的關鍵部分可以表示如下:do 若當前位置可通, 則將當前位置插入棧頂; / 納入路徑 若該位置是出口位置,則算法結束; / 此時棧中存放的是一條從入口位置到出口位置的路徑否則切換當前位置的東鄰方塊為新的當前位置; 否則若棧不空且棧
5、頂位置尚有其他方向未被探索, 則設定新的當前位置為: 沿順時針方向旋轉找到的棧頂位置的下一相鄰塊; 若棧不空但棧頂位置的四周均不可通, 則 刪去棧頂位置; / 從路徑中刪去該通道塊若棧不空,則重新測試新的棧頂位置, 直至找到一個可通的相鄰塊或出棧至??眨?while (棧不空); 6、程序中用的數據結構解析: 程序中用了順序棧保存當前找到的路徑,當前位置不可通時,可以出棧,退回到前一個位置再繼續探索通路,棧的定義如下:struct SqStack SElemType *base; / 在棧構造之前和銷毀之后,base的值為NULL SElemType *top; / 棧頂指針 int stac
6、ksize; / 當前已分配的存儲空間,以元素為單位; / 順序棧 棧中元素的類型結構程序中先定義了一個表示坐標的類型結構:struct PosType / 迷宮坐標位置類型 int x; / 行值 int y; / 列值 ;棧中元素的類型結構如下:struct SElemType / 棧的元素類型 int ord; / 通道塊在路徑上的序號 PosType seat; / 通道塊在迷宮中的坐標位置 int di; / 從此通道塊走向下一通道塊的方向(03表示東北) ;7、主函數的流程圖輸出從起點到終點的坐標顯示當前含有通路的迷宮結構輸出沒有這樣的通路輸入所求通路的起點終點坐標顯示當前的迷宮的
7、結構設置內墻設置外墻輸入迷宮的行數列數(包括外墻) 三、 調試分析1、對于程序的設計由簡單到復雜,先設計一個整體的輪廓然后再慢慢的增加程序的功能,這樣能夠有效的減少錯誤,功能慢慢的增加,在前一步的程序運行通過之后再繼續增加功能,這樣在檢查錯誤的時候比較有目的性,提高寫程序的效率。2、對于程序中的錯誤,如果遇到說變量沒有定義或者數據結構沒定義的錯誤,可能是由于你在定義這種數據結構的變量時數據結構還沒有定義,也就是說在定義此數據結構的變量的語句要放在聲明這種結構體之后。3、在寫程序時要注意printf和scanf語句的格式,格式不對會得不到你想要的結果。4、寫程序時一定要瞻前顧后,前后一致,包括名
8、稱、數據類型等等。四、用戶手冊在使用程序時嚴格按照程序給出的提示一步一步來,下面給出程序正常執行的步驟:1、程序會提示“請輸入迷宮的行數,列數(包括外墻):”,這時就需要輸入表示迷宮的二維數組的行數和列數,需要注意的是由于我們在迷宮周圍加了一道墻,所以要輸入的行列數要比實際表示迷宮的行列數多兩行兩列。2、程序提示“請輸入迷宮內墻單元數:”,此時需要輸入迷宮中墻的數目。3、程序提示“請依次輸入迷宮內墻每個單元的行數,列數:”,此時要輸入迷宮中所有墻的坐標,我們用數組中的一個元素來表示墻。4、在輸入了迷宮所有內墻的坐標后,程序會顯示出迷宮的結構,然后程序會提示“請輸入起點的行數,列數:”,此時需要
9、輸入所求通路的起點坐標。5、程序提示“請輸入終點的行數,列數:”,此時需要輸入所求通路的終點的坐標。6、終點坐標輸入完畢之后,程序會顯示出兩種運行的結果,一種是輸出了迷宮的結構,此時迷宮中已包含了所找的通路,用連續的數字表示出了通路在迷宮中是如何走的,此時迷宮中的-1表示找通路時走過的單元但是通路不通。注意:再輸入內墻單元的坐標是一定要細心,不要錯輸,也不要漏輸。否則程序會出錯。五、測試結果迷宮的測試數據如下:左上角(1,1)為入口,右下角(9,8)為出口。 1 2 3 4 5 6 7 800100010001000100000110101110010000100000100010101111
10、0011100010111000000程序的測試結果為:1、程序的開始界面2、輸入迷宮的行數列數之后3、輸入內墻的個數之后4、再輸入了所有內墻的坐標后,程序會給出迷宮的結構5、輸入所求通路的起點坐標6、輸入所求通路的終點坐標后會得到結果 結果以迷宮的形式輸出 結果用坐標和下一位值的方向表示六、附錄(附有完整的源程序)源程序如下:#includestdio.h#includestdlib.h#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;#define ST
11、ACK_INIT_SIZE 10 / 存儲空間初始分配量#define STACKINCREMENT 2 / 存儲空間分配增量struct PosType / 迷宮坐標位置類型 int x; / 行值 int y; / 列值 ;struct SElemType / 棧的元素類型 int ord; / 通道塊在路徑上的序號 PosType seat; / 通道塊在迷宮中的坐標位置 int di; / 從此通道塊走向下一通道塊的方向(03表示東北) ;struct SqStack SElemType *base; / 在棧構造之前和銷毀之后,base的值為NULL SElemType *top;
12、/ 棧頂指針 int stacksize; / 當前已分配的存儲空間,以元素為單位; / 順序棧SqStack S;#define MAXLENGTH 25 / 設迷宮的最大行列為25typedef int MazeTypeMAXLENGTHMAXLENGTH; / 迷宮數組行列 / 全局變量 MazeType m; / 迷宮數組 int curstep=1; / 當前足跡,初值為1 Status InitStack(SqStack &S) / 構造一個空棧S if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType) e
13、xit(OVERFLOW); / 存儲分配失敗 S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; Status StackEmpty(SqStack S) / 若棧S為空棧,則返回TRUE,否則返回FALSE if(S.top=S.base) return TRUE; else return FALSE; Status Push(SqStack &S,SElemType e) / 插入元素e為新的棧頂元素 if(S.top-S.base=S.stacksize) / 棧滿,追加存儲空間 S.base=(SElemType*) reall
14、oc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType); if(!S.base) exit(OVERFLOW); / 存儲分配失敗 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; *(S.top)+=e; return OK; Status Pop(SqStack &S,SElemType &e) / 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR if(S.top=S.base) return ERROR; e=*-S.top; return O
15、K; Status Pass(PosType b) / 當迷宮m的b點的序號為0(可通過路徑),return OK; 否則,return ERROR。 if(mb.xb.y=0) return OK; else return ERROR; void FootPrint(PosType a) / 使迷宮m的a點的序號變為足跡(curstep) ma.xa.y=curstep; PosType NextPos(PosType c,int di) / 根據當前位置及移動方向,返回下一位置 PosType direc4=0,1,1,0,0,-1,-1,0; / 行增量,列增量 / 移動方向,依次為東南
16、西北 c.x+=direcdi.x; c.y+=direcdi.y; return c; void MarkPrint(PosType b) / 使迷宮m的b點的序號變為-1(不能通過的路徑) mb.xb.y=-1; Status MazePath(PosType start,PosType end) / 算法3.3 / 若迷宮maze中存在從入口start到出口end的通道,則求得一條 / 存放在棧中(從棧底到棧頂),并返回TRUE;否則返回FALSE PosType curpos; InitStack(S); SElemType e; curpos=start; do if(Pass(cu
17、rpos) / 當前位置可以通過,即是未曾走到過的通道塊 FootPrint(curpos); / 留下足跡 e.ord=curstep; e.seat.x=curpos.x; e.seat.y=curpos.y; e.di=0; Push(S,e); / 入棧當前位置及狀態 curstep+; / 足跡加1 if(curpos.x=end.x&curpos.y=end.y) / 到達終點(出口) return TRUE; curpos=NextPos(curpos,e.di); else / 當前位置不能通過 if(!StackEmpty(S) Pop(S,e); / 退棧到前一位置 cur
18、step-; while(e.di=3&!StackEmpty(S) / 前一位置處于最后一個方向(北) MarkPrint(e.seat); / 留下不能通過的標記(-1) Pop(S,e); / 退回一步 curstep-; if(e.di3) / 沒到最后一個方向(北) e.di+; / 換下一個方向探索 Push(S,e); curstep+; curpos=NextPos(e.seat,e.di); / 設定當前位置是該新方向上的相鄰塊 while(!StackEmpty(S); return FALSE; void Print(int x,int y) / 輸出迷宮的解 int i,j; for(i=0;ix;i+) for(j=0;jy;j+) printf(%3d,mij); printf(n); void main() PosType begin,end; int i,j,x,y,x1,y1; SElemType a; SqStack T; InitStack(T); printf(請輸入迷宮的行數,列數(包括外墻):); scanf(%d%d,&x,&y); for(i=0;iy;i+) / 定義周邊值為0(同墻) m0i=1; / 行周邊 mx-1i=1; for(j=1;jx-1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年再生資源行業市場發展分析與發展前景及投資戰略研究報告
- 2025-2030年中國鮮黃瓜和小黃瓜行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國非處方(OTC)止痛藥行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國鋁壓延制品行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國醋酸乙烯酯乳液聚合物行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國道格拉斯冷杉門行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國超聲波洗瓶機行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國視頻會議攝像機行業發展分析及前景趨勢與投資戰略研究報告
- 2025-2030年中國蓄電池測試設備行業市場深度調研及發展趨勢與投資研究報告
- 2025-2030年中國蘇合香提取物行業市場現狀供需分析及投資評估規劃分析研究報告
- 血管內導管相關性血流感染預防與診治2025
- 國際教育機構外教派遣服務協議
- 2025年安慶宿松縣縣屬國有企業招聘57人筆試參考題庫附帶答案詳解析集合
- 部編人教版一年級下冊道德與法治復習計劃
- 新基建浪潮下臨沂市智慧交通管理的創新與突破
- 臨時用電施工方案技術交底
- 中國狼瘡腎炎診治和管理指南(2025版)解讀
- 廠房維修合同協議書模板
- 安徽省合肥四十五中學2025屆數學七下期末達標檢測試題含解析
- 2025年Z世代消費行為與品牌社群營銷研究報告
- 2025年春季《中華民族共同體概論》第二次平時作業-國開(XJ)-參考資料
評論
0/150
提交評論