版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、 需求分析1.選題理由本次課設(shè)我選擇了迷宮問(wèn)題,迷宮求解是數(shù)據(jù)結(jié)構(gòu)課程的一個(gè)經(jīng)典問(wèn)題,迷宮問(wèn)題要求尋找一條從入口到出口的路徑。通常用的是“窮舉求解”的方法。為了保證在任何位置上都能原路退回,顯然需要用一個(gè)后進(jìn)先出的結(jié)構(gòu)來(lái)保存從入口到當(dāng)前位置的路徑。因此,在求解迷宮通路的算法中要應(yīng)用“?!钡乃枷?。對(duì)于棧的內(nèi)容在整個(gè)學(xué)期的學(xué)習(xí)中我也有了一定的了解,所以選擇了迷宮這一經(jīng)典問(wèn)題作為本次課設(shè)的內(nèi)容。 2.基本原理分析 迷宮問(wèn)題通常是用“窮舉求解”方法解決,即從入口出發(fā),順著某一個(gè)方向進(jìn)行探索,若能走通,則繼續(xù)往前走;否則沿著原路退回,換一個(gè)方向繼續(xù)探索,直至出口位置,求得一條通路。假如所有可能的通路
2、都探索到而未能到達(dá)出口,則所設(shè)定的迷宮沒有通路。棧是一個(gè)后進(jìn)先出的結(jié)構(gòu),可以用來(lái)保存從入口到當(dāng)前位置的路徑。以二維數(shù)組存儲(chǔ)迷宮數(shù)據(jù),通常設(shè)定入口點(diǎn)的下標(biāo)為(1,1),出口點(diǎn)的下標(biāo)為(n,n)。為處理方便起見,在迷宮的四周加一圈障礙。對(duì)于迷宮任何一個(gè)位置,均約定東、南、西、北四個(gè)方向可通。 3.功能要求 (1)以一個(gè)二維數(shù)組Mazem+2n+2表示迷宮,其中:Maze0j和Mazem+1j(0<=j<=n+1)及Mazei0和Mazein+1 (0<=i<=m+1)為做外層的一圈障礙。數(shù)組中以0表示通路,1表示障礙,限定迷宮的大小為:m,n<=10。(2)用戶需用文
3、件的形式輸入迷宮的數(shù)據(jù):文件中第一行的數(shù)據(jù)為迷宮的行數(shù)m和列數(shù)n;從第2行至第m+1行(每行n個(gè)數(shù))為迷宮值,用0,1輸入,同行中的兩個(gè)數(shù)字之間用空白字符相隔。(3)迷宮的入口位置和出口位置可由用戶隨時(shí)設(shè)定。(4)若設(shè)定的迷宮存在通路,則以長(zhǎng)方陣形式將迷宮及其通路輸出到標(biāo)準(zhǔn)輸出文件上,其中字符“#”表示障礙,“*”表示路徑,“”表示曾途經(jīng)該位置但不能到達(dá)出口,其余位置用空格符表示。若設(shè)定迷宮不存在通路則報(bào)告相應(yīng)信息(5)本程序只求出一條成功的通路。(6)程序執(zhí)行的命令為:1,創(chuàng)建迷宮;2,求解迷宮;3,輸出迷宮的解。二、 詳細(xì)設(shè)計(jì)源程序:#include <stdio.h>#inc
4、lude <stdlib.h>#include <string.h>#define MAXLEN 10/迷宮包括外墻最大行列數(shù)目#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0 typedef int Status;/ 坐標(biāo)位置類型 typedef struct int r,c; PosType;/迷宮中r行c列的位置/迷宮類型 typedef struct int r;
5、; int c; char arrMAXLENMAXLEN;/可取' ','*','','#'MazeType; typedef struct/int step; / 當(dāng)前位置在路徑上的“序號(hào)” PosType seat; /當(dāng)前的坐標(biāo)位置 int di; /往下一坐標(biāo)位置的方向SElemType; /結(jié)點(diǎn)類型typedef struct NodeType
6、 SElemType data; NodeType *next;NodeType,*LinkType;/棧類型 typedef struct LinkType top; int stacksize;SqStack; PosType start;PosType end;MazeType maze;bool found; /創(chuàng)建棧Status InitStack(SqStack &S) S.top=(LinkType)malloc(sizeof(No
7、deType); S.top->next=NULL; S.stacksize=0; return OK; /進(jìn)棧Status Push(SqStack &S,SElemType &e) LinkType p; p=(NodeType*)malloc(sizeof(NodeType); p->data=e; p->next=S.top; S.top=p;
8、; S.stacksize+; return OK; /判斷是否為棧空Status StackEmpty(SqStack S) if(S.top->next=NULL) return OK; return ERROR; /出棧Status Pop(SqStack &S,SElemType &e) LinkType p; if(StackEmpty(S) return ERROR; p=S.top;
9、 e=p->data; S.top=S.top->next; S.stacksize-; free(p); return OK; /銷毀棧Status DestroyStack(SqStack &S) LinkType p; while(S.top!=NULL) p=S.top;
10、 S.top=S.top->next; free(p); /一個(gè)一個(gè)刪除 if(S.top=NULL) return OK; else return ERROR; /曾走過(guò)但不是通路標(biāo)記并返回OKStatus MarkPrint(MazeType &maze,PosType curpos) maze.arrcurpos.rcurpos.c=''/""表示曾走過(guò)但不通
11、60;return OK; /曾走過(guò)而且是通路標(biāo)記并返回OKStatus FootPrint(MazeType &maze,PosType curpos) maze.arrcurpos.rcurpos.c='*'/"*"表示可通 return OK; /選擇下一步的方向PosType NextPos(PosType &curpos,int i) PosType cpos; cpos=curpos; switch(i)
12、 /1.2.3.4分別表示東,南,西,北方向 case 1 : cpos.c+=1; break; case 2 : cpos.r+=1; break;
13、0; case 3 : cpos.c-=1; break; case 4 : cpos.r-=1; break;return cpos; /判斷當(dāng)前位置是否可通 Status Pass(MazeType &maze, PosType curpos) if(maze.arrcurpos.
14、rcurpos.c=' ') return TRUE; else return FALSE; /創(chuàng)建迷宮/按照用戶輸入的二維數(shù)組(0或1),設(shè)置迷宮maze的初值,包括加上邊緣一圈的值void InitMaze(MazeType &maze, char aMAXLENMAXLEN, int row, int col) maze.r=row; maze.c=col; for(int i=0;i<=col+1;i+)
15、 a0i='1' arow+1i='1' for(i=0;i<=row+1;i+) ai0='1' aicol+1='1' for(i=0;i<=maze.r+2;i+)
16、60; for(int j=0;j<maze.c+2;j+) if(aij='1') maze.arrij='#' else maze.arrij=' ' /求迷宮路徑的偽碼算法:Status MazePath(MazeType &maze,Po
17、sType start,PosType end)/求解迷宮maze中,從入口start到出口end的一條路徑,若存在,返回TRUE,否則返回FALSE PosType curpos; SqStack S; SElemType e; InitStack(S); curpos=start;/設(shè)定“當(dāng)前位置”為“入口位置” /curstep=1; /探索第一步 found=false;do if(Pass(maze,cur
18、pos) /當(dāng)前位置可以通過(guò),即是未曾走到過(guò)的通道塊留下足跡 FootPrint(maze,curpos);/做可以通過(guò)的標(biāo)識(shí)/e.step=curstep; e.seat=curpos; e.di=1; /為棧頂元素賦值 Push(S,e); /加入路徑 if(curpo
19、s.r=end.r && curpos.c=end.c) found=true;/如果到達(dá)終點(diǎn)返回true else curpos=NextPos(curpos,1);/下一位置是當(dāng)前位置的東鄰 else /當(dāng)前位置不能通過(guò) if(!StackEmpty(S)
20、60; Pop(S,e); while(e.di=4 && !StackEmpty(S) MarkPrint(maze,e.seat); /留下不能通過(guò)的標(biāo)記
21、60; Pop(S,e); if(e.di<4) e.di+; /換下個(gè)方向 Push(S,e); &
22、#160; / curpos=NextPos(e.seat,e.di); /進(jìn)行探索 whi
23、le(!StackEmpty(S)&&!found);DestroyStack(S);return found; /將標(biāo)記路徑信息的迷宮(字符型方陣)輸出到終端(包括外墻)void PrintMaze(MazeType &maze) for(int i=0;i<=maze.r+2;i+) for(int j=0;j<=maze.c+2;j+) printf(" %c",maze.arrij);/輸出迷宮
24、0; printf("n"); /系統(tǒng)初始化void Initialization()system("cls"); printf(" welcome to the game! "); printf(
25、"n*");printf("n*創(chuàng)建迷宮-c 執(zhí)行迷宮-m 輸出迷宮-p 退出-q*");printf("n*");printf("nn 操作:-"); /讀入操作命令符,顯示提示信息void ReadCommand(char &cmd) do if(cmd='c') printf("n*");
26、160; printf("n*選擇操作 :執(zhí)行迷宮-m *"); printf("n* 退出-:q *"); printf("n*"); printf("nn 操作:-");
27、0; else if(cmd='m') printf("n*"); printf("n*選擇操作 :輸出迷宮-p *"); printf("n* 退出-:q *"); printf(&qu
28、ot;n*"); printf("nn 操作:-"); else if(cmd='p') printf("n*"); printf("n*選擇操作 :執(zhí)行迷宮-c *"); printf("
29、n* 退出-:q *"); printf("n*"); printf("nn 操作:-"); cmd=getchar();while(!(cmd=
30、9;c'|cmd='m'|cmd='p'|cmd='q'); /解釋cmd-具體執(zhí)行void Interpre(char cmd)switch(cmd)case 'c': int rnum, cnum, i=0,m=1,n=1; char a2MAXLENMAXLEN; char input1; char data1000; printf("n請(qǐng)輸入迷宮數(shù)據(jù)文件名!n");&
31、#160; scanf("%s",input); FILE *fp; fp=fopen(input,"r"); if(!fp) printf("n不能打開文件n"); break; while(!feof(fp) fscanf(fp,"%s",&a
32、mp;datai); if(i=0) rnum=(int)datai-(int)'0' if(i=1) cnum=(int)datai-(int)'0'
33、 if(i>=2) if(n>cnum)m+;n=1; a2mn=datai; n+; i+; fclose(fp);InitMaze(maze, a2, rnum, cnum); printf("n迷宮建立完成!n");
34、160; break; case 'm': printf("n請(qǐng)輸入迷宮入口的坐標(biāo),以空格為間隔:-"); scanf("%d %d",&start.r,&start.c); printf("n請(qǐng)輸入迷宮出口的坐標(biāo),以空格為間隔:-"); scanf("%d %d",&end.r,&end.c); MazePath(maze, start, end); break; case 'p':
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湘教版選擇性必修1物理下冊(cè)月考試卷含答案
- 2025年蘇人新版七年級(jí)歷史上冊(cè)月考試卷含答案
- 二零二五年度體育產(chǎn)業(yè)投資擔(dān)保合同3篇
- 2025年度智能門禁系統(tǒng)租賃合同范本升級(jí)版4篇
- 2025年度民間借貸裁判觀點(diǎn)匯編及法律適用指南合同4篇
- 2025版模板工建筑工程施工圖審查合同范本(含技術(shù)要求)4篇
- 技術(shù)開發(fā)合同
- 二零二五年度旅游景區(qū)門票銷售代理合同范本4篇
- 二零二五年度企業(yè)數(shù)據(jù)托管與安全管理合同
- 2025年度新型建筑涂料打蠟與防水合同4篇
- 五年級(jí)上冊(cè)寒假作業(yè)答案(人教版)
- 2025年山東浪潮集團(tuán)限公司招聘25人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年財(cái)政部會(huì)計(jì)法律法規(guī)答題活動(dòng)題目及答案一
- 2025年江西省港口集團(tuán)招聘筆試參考題庫(kù)含答案解析
- (2024年)中國(guó)傳統(tǒng)文化介紹課件
- 液化氣安全檢查及整改方案
- 《冠心病》課件(完整版)
- 2024年云網(wǎng)安全應(yīng)知應(yīng)會(huì)考試題庫(kù)
- 公園保潔服務(wù)投標(biāo)方案
- 光伏電站項(xiàng)目合作開發(fā)合同協(xié)議書三方版
- 2024年秋季新滬教版九年級(jí)上冊(cè)化學(xué)課件 第2章 空氣與水資源第1節(jié) 空氣的組成
評(píng)論
0/150
提交評(píng)論