




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、一、 需求分析1.選題理由本次課設(shè)我選擇了迷宮問題,迷宮求解是數(shù)據(jù)結(jié)構(gòu)課程的一個經(jīng)典問題,迷宮問題要求尋找一條從入口到出口的路徑。通常用的是“窮舉求解”的方法。為了保證在任何位置上都能原路退回,顯然需要用一個后進(jìn)先出的結(jié)構(gòu)來保存從入口到當(dāng)前位置的路徑。因此,在求解迷宮通路的算法中要應(yīng)用“棧”的思想。對于棧的內(nèi)容在整個學(xué)期的學(xué)習(xí)中我也有了一定的了解,所以選擇了迷宮這一經(jīng)典問題作為本次課設(shè)的內(nèi)容。 2.基本原理分析 迷宮問題通常是用“窮舉求解”方法解決,即從入口出發(fā),順著某一個方向進(jìn)行探索,若能走通,則繼續(xù)往前走;否則沿著原路退回,換一個方向繼續(xù)探索,直至出口位置,求得一條通路。假如所有可能的通路
2、都探索到而未能到達(dá)出口,則所設(shè)定的迷宮沒有通路。棧是一個后進(jìn)先出的結(jié)構(gòu),可以用來保存從入口到當(dāng)前位置的路徑。以二維數(shù)組存儲迷宮數(shù)據(jù),通常設(shè)定入口點(diǎn)的下標(biāo)為(1,1),出口點(diǎn)的下標(biāo)為(n,n)。為處理方便起見,在迷宮的四周加一圈障礙。對于迷宮任何一個位置,均約定東、南、西、北四個方向可通。 3.功能要求 (1)以一個二維數(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個數(shù))為迷宮值,用0,1輸入,同行中的兩個數(shù)字之間用空白字符相隔。(3)迷宮的入口位置和出口位置可由用戶隨時設(shè)定。(4)若設(shè)定的迷宮存在通路,則以長方陣形式將迷宮及其通路輸出到標(biāo)準(zhǔn)輸出文件上,其中字符“#”表示障礙,“*”表示路徑,“”表示曾途經(jīng)該位置但不能到達(dá)出口,其余位置用空格符表示。若設(shè)定迷宮不存在通路則報告相應(yīng)信息(5)本程序只求出一條成功的通路。(6)程序執(zhí)行的命令為:1,創(chuàng)建迷宮;2,求解迷宮;3,輸出迷宮的解。二、 詳細(xì)設(shè)計源程序:#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)前位置在路徑上的“序號” 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); /一個一個刪除 if(S.top=NULL) return OK; else return ERROR; /曾走過但不是通路標(biāo)記并返回OKStatus MarkPrint(MazeType &maze,PosType curpos) maze.arrcurpos.rcurpos.c=''/""表示曾走過但不通
11、60;return OK; /曾走過而且是通路標(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)前位置可以通過,即是未曾走到過的通道塊留下足跡 FootPrint(maze,curpos);/做可以通過的標(biāo)識/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)前位置不能通過 if(!StackEmpty(S)
20、60; Pop(S,e); while(e.di=4 && !StackEmpty(S) MarkPrint(maze,e.seat); /留下不能通過的標(biāo)記
21、60; Pop(S,e); if(e.di<4) e.di+; /換下個方向 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請輸入迷宮數(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請輸入迷宮入口的坐標(biāo),以空格為間隔:-"); scanf("%d %d",&start.r,&start.c); printf("n請輸入迷宮出口的坐標(biāo),以空格為間隔:-"); scanf("%d %d",&end.r,&end.c); MazePath(maze, start, end); break; case 'p':
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 目標(biāo)設(shè)定中的常見誤區(qū)考核試卷
- 學(xué)校文化氛圍對學(xué)生職業(yè)適應(yīng)能力的培養(yǎng)考核試卷
- 園林工具制造中的復(fù)合材料應(yīng)用研究考核試卷
- 風(fēng)味穩(wěn)定性考核試卷
- 光纖通信網(wǎng)絡(luò)傳輸速率標(biāo)準(zhǔn)考核試卷
- 急救知識試題庫+參考答案
- 機(jī)器人科技探索未來主題班會課件
- 低碳生活活動總結(jié)15篇
- 每周雙講活動方案
- 民俗開學(xué)儀式活動方案
- 2016-2022年全國高考英語讀后續(xù)寫及概要寫作試題真題及范文
- GB/T 17431.2-2010輕集料及其試驗方法第2部分:輕集料試驗方法
- 茶文化與茶藝實(shí)驗指導(dǎo)書
- 第三章-液液萃取課件
- 質(zhì)量管理部半年總結(jié)PPT
- 2022年德宏傣族景頗族自治州工會系統(tǒng)招聘考試題庫及答案解析
- 雪山上的達(dá)娃讀后感范文5篇
- 安全生產(chǎn)基本情況調(diào)研表
- 西方音樂史名詞解釋復(fù)習(xí)
- 華為自評審核表 Quality System Audit
- 汽車標(biāo)準(zhǔn)件手冊
評論
0/150
提交評論