版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、課程設(shè)計(jì)題目迷宮與棧問題二、課程設(shè)計(jì)內(nèi)容(含技術(shù)指標(biāo))【問題描述】以一個(gè)mxn的長(zhǎng)方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設(shè)計(jì)一個(gè)程序,對(duì)任意設(shè)定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結(jié)論?!救蝿?wù)要求】首先實(shí)現(xiàn)一個(gè)以鏈表作存儲(chǔ)結(jié)構(gòu)的棧類型,然后編寫一個(gè)求解迷宮的非遞歸程序。求得的通路以三元組(i,j,d)的形式輸出。其中:(i,j)指示迷宮中的一個(gè)坐標(biāo),d表示走到下一坐標(biāo)的方向。如,對(duì)于下列數(shù)據(jù)的迷宮,輸出一條通路為:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),。編寫遞歸形式的算法,求得迷宮中所有可能的通路。以方陣形式輸出迷宮及其通
2、路。【測(cè)試數(shù)據(jù)】迷宮的測(cè)試數(shù)據(jù)如下:左上角(0,1)為入口,右下角(8,9)為出口。迷宮與棧問題摘 要數(shù)據(jù)結(jié)構(gòu)是研究與數(shù)據(jù)之間的關(guān)系,是互相之間一種或多種特定關(guān)系的數(shù)據(jù)元素的集合,我們稱這一關(guān)系為數(shù)據(jù)的邏輯結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)的表示(又稱映像)稱為數(shù)據(jù)的物理結(jié)構(gòu),又稱存儲(chǔ)結(jié)構(gòu)。本次課程設(shè)計(jì)是迷宮求解問題,主要是模擬從入口到出口的通路。程序中的數(shù)據(jù)采取的是“?!弊鳛閿?shù)據(jù)的邏輯結(jié)構(gòu),并且使用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),即是實(shí)現(xiàn)一個(gè)以鏈表作存儲(chǔ)結(jié)構(gòu)的棧類型。本課程設(shè)計(jì)實(shí)現(xiàn)了鏈棧的建立,入棧,出棧,判斷棧是否為空的方法,關(guān)鍵的是迷宮通路路徑的“窮舉求解”和遞歸求解的方法。本課程設(shè)計(jì)重要說明了系統(tǒng)的設(shè)計(jì)思路、概要設(shè)
3、計(jì)以及各個(gè)功能模塊的詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)方法。本次程序的開發(fā)工具是microsoft visual studio 2008,編程語言是c語言。關(guān)鍵詞:迷宮求解 鏈棧 窮舉求解 遞歸求解目 錄摘要31需求分析 11.1基本原理分析11.2功能要求12 概要設(shè)計(jì)22.1數(shù)據(jù)結(jié)構(gòu)及其抽象數(shù)據(jù)類型的定義22.1.1棧的抽象數(shù)據(jù)類型22.1.2迷宮的抽象數(shù)據(jù)類型22.1.3功能模塊分解33 詳細(xì)設(shè)計(jì)43.1主函數(shù)與各功能模塊43.2迷宮路徑模塊43.2.1算法分析43.2.2流程圖54軟件測(cè)試64.1調(diào)試過程中遇到的問題的解決,以及程序設(shè)計(jì)思想的實(shí)現(xiàn)64.2測(cè)試數(shù)據(jù)64.3測(cè)試結(jié)果84.4結(jié)果分析10參考文獻(xiàn)
4、11心得體會(huì)12教師評(píng)語13答辯記錄表14 附錄151 需求分析1.1基本原理分析迷宮問題通常是用“窮舉求解”方法解決,即從入口出發(fā),順著某一個(gè)方向進(jìn)行探索,若能走通,則繼續(xù)往前走;否則沿著原路退回,換一個(gè)方向繼續(xù)探索,直至出口位置,求得一條通路。假如所有可能的通路都探索到而未能到達(dá)出口,則所設(shè)定的迷宮沒有通路。棧是一個(gè)后進(jìn)先出的結(jié)構(gòu),可以用來保存從入口到當(dāng)前位置的路徑。定義迷宮類型來存儲(chǔ)迷宮數(shù)據(jù),通常設(shè)定入口點(diǎn)的下標(biāo)為(1,1),出口點(diǎn)的下標(biāo)為(n,n)。為處理方便起見,在迷宮的四周加一圈障礙。對(duì)于迷宮任何一個(gè)位置,均約定東、南、西、北四個(gè)方向可通。1.2功能要求(1)以一個(gè)mxn的長(zhǎng)方陣表
5、示迷宮,0和1分別表示迷宮中的通路和障礙。迷宮的四周有一圈障礙。(2)程序輸出的結(jié)果以三元組(i,j,di)的形式輸出,其中:(i,j)指示迷宮中的一個(gè)坐標(biāo),di表示走到下一坐標(biāo)的方向,di的取值為1、2、3、4分別表示東、南、西、北(3)程序能夠輸出一個(gè)任意的迷宮從指定入口到出口的所有通路,以及以方陣形式輸出迷宮(4)若設(shè)定的迷宮存在通路,則以方陣形式將迷宮及其通路輸出到標(biāo)準(zhǔn)輸出文件上,其中字符“1”表示障礙,“2”表示路徑,“3”表示曾途經(jīng)該位置但不能到達(dá)出口,其余位置用0表示。若設(shè)定迷宮不存在通路則報(bào)告相應(yīng)信息2 概要設(shè)計(jì)2.1數(shù)據(jù)結(jié)構(gòu)及其抽象數(shù)據(jù)類型的定義2.1.1棧的抽象數(shù)據(jù)類型ad
6、t linkstack數(shù)據(jù)對(duì)象:d=ai| aicharset,i=1,2n,n=0數(shù)據(jù)關(guān)系:r1=| ai-1, aid,i=2,n基本操作:initlinkstack(&s)操作結(jié)果:構(gòu)造一個(gè)空棧s。linkstackempty(&s)初始條件:棧s已存在。操作結(jié)果:若s為空棧,則返回true,否則返回false。pushlinkstack (&s,e)初始條件:棧s已存在。操作結(jié)果:在棧s的棧頂插入新的棧頂元素e。poplinkstack (&s,&e)初始條件:棧s已存在。操作結(jié)果:刪除s的棧頂元素,并以e返回其值。 adt linkstack2.1.2迷宮的抽象數(shù)據(jù)類型adt maz
7、e數(shù)據(jù)對(duì)象:d=ai,j| ai,j0,1,2,3,0=i=m-1,0=j=n-1,m,n迷宮模塊-棧模塊3 詳細(xì)設(shè)計(jì)3.1主函數(shù)與各功能模塊主函數(shù)的各函數(shù)調(diào)用關(guān)系如圖3-1所示,主函數(shù)調(diào)用創(chuàng)建迷宮函數(shù)和求解所有路徑的函數(shù),其中創(chuàng)建迷宮信息的函數(shù)調(diào)用初始化迷宮和輸出迷宮。主函數(shù)求解所有路徑mazepath初始化迷宮initmaze初始化棧initlinkstackack輸出迷宮printmaze入棧pushlinkstack出棧poplinkstack判斷棧是否為空linkstackempty留下標(biāo)記markprint判斷方向nextpos留下足跡footprint判斷能否通過pass圖3-1
8、3.2 迷宮路徑模塊3.2.1算法分析 解決迷宮問題最重要的程序段是找到通路,并存儲(chǔ)在棧里,現(xiàn)只分析實(shí)現(xiàn)這一過程的函數(shù)do 若當(dāng)前位置可通, 則 將當(dāng)前位置插入棧頂; 若該位置是出口位置,則結(jié)束; 否則切換當(dāng)前位置的東鄰方塊為新的當(dāng)前位置; 否則, 若棧不空且棧頂位置尚有其他方向未經(jīng)探索, 則設(shè)定的新的當(dāng)前位置為沿順時(shí)針方向旋轉(zhuǎn)找到的棧頂位置的下一相鄰塊; 若棧不空但棧頂位置的四周均不可通, 則 刪去棧頂位置; 若棧不空,則重新測(cè)試新的棧頂位置, 直到找到一個(gè)可通的相鄰塊或出棧至棧空; while(棧不空);3.2.2 流程圖將入口、出口位置傳入方法里判斷當(dāng)前位置是否可通將元素入棧是否到達(dá)迷宮
9、出口右邊是否存在通路上邊是否存在通路左邊是否存在通路下邊是否存在通路存儲(chǔ)結(jié)點(diǎn)入棧循環(huán)結(jié)束,無解迷宮有解迷宮圖3-24軟件測(cè)試4.1調(diào)試過程中遇到的問題的解決,以及程序設(shè)計(jì)思想的實(shí)現(xiàn)(1)調(diào)試過程中出現(xiàn)的錯(cuò)誤有編譯連接時(shí)的一些語法錯(cuò)誤,也有由于算法存在問題而導(dǎo)致程序運(yùn)行沒有結(jié)果或者不是預(yù)期的結(jié)果。這里主要說一下自己由于算法而導(dǎo)致的錯(cuò)誤:因?yàn)闆]有注意結(jié)點(diǎn)不能重復(fù)走,所以造成了死循環(huán),程序沒有結(jié)果。通過分析后把走過的結(jié)點(diǎn)變?yōu)椴豢勺叩慕Y(jié)點(diǎn),這樣就避免了重復(fù)走到該結(jié)點(diǎn)。還有就是判斷迷宮是否有通路的這個(gè)結(jié)果不能如預(yù)期的結(jié)果那樣:有通路就輸出所有的通路,沒有就輸出“沒有路徑可走!”。因?yàn)闆]有通路可走的時(shí)候棧
10、是空的,但是輸出所有的路徑以后棧也是空的。當(dāng)迷宮有通路的時(shí)候,在輸出所有路徑以后還是會(huì)輸出“沒有路徑可走!”這句話。當(dāng)迷宮沒有通路的時(shí)候,輸出“沒有路徑可走!”這句話。因?yàn)樗惴ǖ乃枷胧沁@樣的,所以達(dá)不到預(yù)期的結(jié)果。解決的方法是如果迷宮有通路則輸出所有的通路,如果迷宮沒有通路,則沒有結(jié)果輸出。(2)迷宮的求解一般采用的是“窮舉求解”,利用棧的思想,先將入口位置進(jìn)棧,判斷方向,若其方向可通,則進(jìn)棧,若不通,則出棧,如此循環(huán)下去。4.2測(cè)試數(shù)據(jù)迷宮輸入遞歸求路 非遞歸求路徑:以方陣形式輸出迷宮及其通路: 測(cè)試無通路的迷宮: 4.3測(cè)試結(jié)果迷宮輸入: 求通路:以方陣形式輸出迷宮及其通路:4.4結(jié)果分析
11、本題中三個(gè)主要算法:initmaze,mazepath和printmaze時(shí)間復(fù)雜度均為o(row*line),空間復(fù)雜度也為o(row*line)參考文獻(xiàn)1 嚴(yán)蔚敏、吳偉民:數(shù)據(jù)結(jié)構(gòu)(c語言版)m,清華大學(xué)出版社 2007年版2 譚浩強(qiáng):c語言設(shè)計(jì)(第三版)m,清華大學(xué)出版社 2005年版3 曹衍龍、林瑞仲、徐慧:c語言實(shí)例解析精粹(第二版)m,人民郵電出版社心得 體會(huì)通過這段時(shí)間的課程設(shè)計(jì),本人對(duì)計(jì)算機(jī)的應(yīng)用,數(shù)據(jù)結(jié)構(gòu)的作用以及c語言的使用都有了更深的了解。尤其是c語言的進(jìn)步讓我深刻的感受到任何所學(xué)的知識(shí)都需要實(shí)踐,沒有實(shí)踐就無法真正理解這些知識(shí)以及掌握它們,使其成為自己的財(cái)富。在設(shè)計(jì)此程
12、序時(shí),剛開始感到比較迷茫,然后一步步分析,試著寫出基本的算法,思路漸漸清晰,最后完成程序。當(dāng)然也遇到不少的問題,也正是因?yàn)檫@些問題引發(fā)的思考給我?guī)Я耸斋@。在遇到描寫迷宮路徑的算法時(shí),我感到有些困難,后來經(jīng)過一步步分析和借鑒書本上的窮舉求解的算法,最后把算法寫出來。但其要求是要輸出迷宮路徑的一步步位置,我通過利用兩個(gè)棧的互相出入棧,達(dá)到棧的逆序輸出。在利用遞歸方法求路徑時(shí)花費(fèi)了我很長(zhǎng)時(shí)間,由于本人對(duì)遞歸方面的知識(shí)運(yùn)用較少,導(dǎo)致我不熟悉它的用法,但最終還是通過詢問同學(xué)、查找書本和上網(wǎng)了解關(guān)于遞歸方面的知識(shí)寫出來了。這次課程設(shè)計(jì)讓我更加深入了解很多方面的知識(shí),如鏈結(jié)構(gòu)的棧類型及其基本操作,數(shù)組的運(yùn)用
13、等等。在程序的編寫中不要一味的模仿,要自己去摸索,只有帶著問題反復(fù)實(shí)踐,才能熟練地掌握和運(yùn)用。在實(shí)際的上機(jī)操作過程中,不僅是讓我們了解數(shù)據(jù)結(jié)構(gòu)的理論知識(shí),更重要的是培養(yǎng)解決實(shí)際問題的能力,所以相信通過此次實(shí)習(xí)可以提高我們分析設(shè)計(jì)能力和編程能力,為后續(xù)課程的學(xué)習(xí)及實(shí)踐打下良好的基礎(chǔ)。附 錄程序源代碼:#include #include #include #define maxlen 10/迷宮包括外墻最大行列數(shù)目#define true 1#define false 0#define ok 1#define error 0#define overflow -2#define stack_init
14、_size 100 /存儲(chǔ)空間初始分配量typedef int status;typedef struct int row;intline;postype;/迷宮中row行l(wèi)ine列的位置typedef struct mazetypeint row; int line; int arrmaxlenmaxlen;mazetype; /迷宮類型typedef struct int ord; / 當(dāng)前位置在路徑上的“序號(hào)” postype seat; /當(dāng)前的坐標(biāo)位置 int di; /往下一坐標(biāo)位置的方向selemtype;typedef struct stacknodeselemtype dat
15、a;struct stacknode *next;*linkstack;/構(gòu)建一個(gè)空棧sint initlinkstack(linkstack &s)s=(linkstack)malloc(sizeof(linkstack); /通過malloc函數(shù)分配空間if (!s)return error; /如果分配失敗,則返回s-next=null;return ok;/判斷棧是否為空status linkstackempty(linkstack &s)if (s!=null) if (s-next=null)return ok;return error;/插入元素e為新的棧頂元素status pu
16、shlinkstack(linkstack &s,selemtype e)linkstack q=s;linkstack m=(linkstack)malloc(sizeof(linkstack); /通過malloc函數(shù)分配空間if (s!=null)while (q-next!=null)q=q-next;m-data=e;m-next=null;q-next=m;return error;/若棧不空,則刪除s的棧頂元素,用e返回其值,并返回ok;否則返回errorstatus poplinkstack(linkstack &s,selemtype &e)linkstack q=s;if
17、(s!=null)if (q-next!=null) /若棧不是空的while (q-next-next!=null)q=q-next;e=q-next-data;q-next=null;return ok;return error;status pass(mazetype mymaze,postype curpos) if(mymaze.arrcurpos.rowcurpos.line=0)return true; / 如果當(dāng)前位置是可以通過,返回else return false; / 其它情況返回void footprint(mazetype &mymaze,postype curpos
18、) mymaze.arrcurpos.rowcurpos.line=2;void markprint(mazetype &mymaze,postype curpos) mymaze.arrcurpos.rowcurpos.line=3;postype nextpos(postype curpos, int dir) postype returnpos; switch (dir) case 1:returnpos.row=curpos.row;returnpos.line=curpos.line+1;break;case 2:returnpos.row=curpos.row+1;returnpo
19、s.line=curpos.line;break;case 3:returnpos.row=curpos.row;returnpos.line=curpos.line-1;break;case 4:returnpos.row=curpos.row-1;returnpos.line=curpos.line;break;return returnpos;status mazepath(mazetype &maze, postype start, postype end) / 若迷宮maze中從入口start到出口end的通道,則求得一條存放在棧中/ (從棧底到棧頂),并返回true;否則返回fal
20、selinkstack s,s1;postype curpos;int curstep;selemtype e;initlinkstack(s);initlinkstack(s1);curpos = start; / 設(shè)定當(dāng)前位置為入口位置curstep = 1; / 探索第一步doif(pass(maze,curpos) / 當(dāng)前位置可通過,即是未曾走到過的通道塊footprint(maze,curpos); / 留下足跡e.di =1;e.ord = curstep;e.seat= curpos;pushlinkstack(s,e); / 加入路徑if(curpos.row = end.r
21、ow & curpos.line=end.line)while(!linkstackempty(s)poplinkstack(s,e);pushlinkstack(s1,e);printf(迷宮的路徑:);while(!linkstackempty(s1)poplinkstack(s1,e);printf(第%d步:(%d,%d,%d) ,e.ord,e.seat,e.di);return (true); / 到達(dá)終點(diǎn)(出口)curpos = nextpos(curpos, 1); / 下一位置是當(dāng)前位置的東鄰curstep+; / 探索下一步else / 當(dāng)前位置不能通過if (!links
22、tackempty(s) poplinkstack(s,e);while (e.di=4 & !linkstackempty(s) markprint(maze,e.seat); poplinkstack(s,e); / 留下不能通過的標(biāo)記,并退回一步curstep-; / whileif (e.di4) e.di+;pushlinkstack(s,e); / 換下一個(gè)方向探索curpos = nextpos(e.seat,e.di); / 當(dāng)前位置設(shè)為新方向的相鄰塊 / if / if / else while (!linkstackempty(s) );printf(此迷宮無通路!n);r
23、eturn false; / mazepath/初始化迷宮status initmaze(mazetype &maze)int i,j;printf(請(qǐng)輸入迷宮的行和列數(shù): ); scanf(%d,%d,&maze.row,&maze.line);printf(請(qǐng)輸入迷宮(以表示可走,1表示有障礙):n);for(i=1;i=maze.row;i+)for(j=1;j=maze.line;j+)scanf(%d,&maze.arrij);for(i=0;i=maze.line+1;i+)/迷宮行外墻maze.arr0i=1; maze.arrmaze.row+1i=1;/for for(i=1
24、;i=maze.row;i+)/迷宮列外墻maze.arri0=1;maze.arrimaze.line+1=1;return ok;/以方陣形式輸出迷宮及其通路void printmaze(mazetype &maze)/將標(biāo)記路徑信息的迷宮輸出到終端(包括外墻)int i,j;for(i=0;i=maze.row+1;i+) for(j=0;j=maze.line+1;j+)printf(%2d,maze.arrij);/輸出迷宮/當(dāng)前位置的標(biāo)記 printf(nn); /printmaze/遞歸算法linkstack l,l1;void mazepath_recursion(mazety
25、pe &maze,postype cur,postype end,int curstep)int i;selemtype e;postype next; / 下一個(gè)位置/ 行增量,列增量postype direc4=0,1,1,0,0,-1,-1,0;/ 移動(dòng)方向,依次為東南西北for(i=0;i=3;i+) / 依次試探東南西北四個(gè)方向next.row=cur.row+direci.row;next.line=cur.line+direci.line;if(maze.arrnext.rownext.line=0) / 是通路e.seat=next;pushlinkstack(l,e);maz
26、e.arrnext.rownext.line=+curstep;if(next.row != end.row | next.line != end.line) / 沒到終點(diǎn)mazepath_recursion(maze,next,end,1); / 試探下一點(diǎn)(遞歸調(diào)用) elseprintf(n); printf(迷宮的路徑:);while(!linkstackempty(l)poplinkstack(l,e);pushlinkstack(l1,e);while(!linkstackempty(l1)poplinkstack(l1,e);printf(%d,%d ) ,e.seat);maze.arrnext.rownext.line=0; / 恢復(fù)為通路,試探下一條路curstep-;void main()mazety
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024高考地理一輪復(fù)習(xí)專練55可持續(xù)發(fā)展的內(nèi)涵和實(shí)現(xiàn)途徑含解析新人教版
- 外墻保溫營(yíng)造做法
- 《費(fèi)孝通-鄉(xiāng)土中國(guó)》差序格局
- 初三八班踐行弟子規(guī)主題班會(huì)課件
- 2024年海南軟件職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(頻考版)含答案解析
- 論交際性操練在漢語詞匯教學(xué)中的實(shí)際運(yùn)用
- 鈣鈦礦電池發(fā)展?jié)摿Ψ治鰣?bào)告
- 2024年浙江旅游職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2024年泉州華光職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2024年防城港市人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 警輔 培訓(xùn) 課件
- GB/T 43543-2023漱口水
- 法拍輔助工作管理制度
- 中控室保密與信息安全政策
- 后端開發(fā)年終總結(jié)
- 萬達(dá)廣場(chǎng)營(yíng)銷活動(dòng)管理及效果考核規(guī)定
- 過敏性皮炎的護(hù)理查房
- 將配偶追加為被執(zhí)行人申請(qǐng)書
- 硬筆書法田字格標(biāo)準(zhǔn)尺寸
- 中建辦公商業(yè)樓有限空間作業(yè)專項(xiàng)施工方案
- 大觀念視域下小學(xué)英語單元整體教學(xué)的實(shí)踐研究 論文
評(píng)論
0/150
提交評(píng)論