版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、 需求分析1.选题理由本次课设我选择了迷宫问题,迷宫求解是数据结构课程的一个经典问题,迷宫问题要求寻找一条从入口到出口的路径。通常用的是“穷举求解”的方法。为了保证在任何位置上都能原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求解迷宫通路的算法中要应用“栈”的思想。对于栈的内容在整个学期的学习中我也有了一定的了解,所以选择了迷宫这一经典问题作为本次课设的内容。 2.基本原理分析 迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路
2、都探索到而未能到达出口,则所设定的迷宫没有通路。栈是一个后进先出的结构,可以用来保存从入口到当前位置的路径。以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。为处理方便起见,在迷宫的四周加一圈障碍。对于迷宫任何一个位置,均约定东、南、西、北四个方向可通。 3.功能要求 (1)以一个二维数组Mazem+2n+2表示迷宫,其中:Maze0j和Mazem+1j(0<=j<=n+1)及Mazei0和Mazein+1 (0<=i<=m+1)为做外层的一圈障碍。数组中以0表示通路,1表示障碍,限定迷宫的大小为:m,n<=10。(2)用户需用文
3、件的形式输入迷宫的数据:文件中第一行的数据为迷宫的行数m和列数n;从第2行至第m+1行(每行n个数)为迷宫值,用0,1输入,同行中的两个数字之间用空白字符相隔。(3)迷宫的入口位置和出口位置可由用户随时设定。(4)若设定的迷宫存在通路,则以长方阵形式将迷宫及其通路输出到标准输出文件上,其中字符“#”表示障碍,“*”表示路径,“”表示曾途经该位置但不能到达出口,其余位置用空格符表示。若设定迷宫不存在通路则报告相应信息(5)本程序只求出一条成功的通路。(6)程序执行的命令为:1,创建迷宫;2,求解迷宫;3,输出迷宫的解。二、 详细设计源程序:#include <stdio.h>#inc
4、lude <stdlib.h>#include <string.h>#define MAXLEN 10/迷宫包括外墙最大行列数目#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0 typedef int Status;/ 坐标位置类型 typedef struct int r,c; PosType;/迷宫中r行c列的位置/迷宫类型 typedef struct int r;
5、; int c; char arrMAXLENMAXLEN;/可取' ','*','','#'MazeType; typedef struct/int step; / 当前位置在路径上的“序号” PosType seat; /当前的坐标位置 int di; /往下一坐标位置的方向SElemType; /结点类型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; /创建栈Status InitStack(SqStack &S) S.top=(LinkType)malloc(sizeof(No
7、deType); S.top->next=NULL; S.stacksize=0; return OK; /进栈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; /曾走过但不是通路标记并返回OKStatus MarkPrint(MazeType &maze,PosType curpos) maze.arrcurpos.rcurpos.c=''/""表示曾走过但不通
11、60;return OK; /曾走过而且是通路标记并返回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; /判断当前位置是否可通 Status Pass(MazeType &maze, PosType curpos) if(maze.arrcurpos.
14、rcurpos.c=' ') return TRUE; else return FALSE; /创建迷宫/按照用户输入的二维数组(0或1),设置迷宫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;/设定“当前位置”为“入口位置” /curstep=1; /探索第一步 found=false;do if(Pass(maze,cur
18、pos) /当前位置可以通过,即是未曾走到过的通道块留下足迹 FootPrint(maze,curpos);/做可以通过的标识/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;/如果到达终点返回true else curpos=NextPos(curpos,1);/下一位置是当前位置的东邻 else /当前位置不能通过 if(!StackEmpty(S)
20、60; Pop(S,e); while(e.di=4 && !StackEmpty(S) MarkPrint(maze,e.seat); /留下不能通过的标记
21、60; Pop(S,e); if(e.di<4) e.di+; /换下个方向 Push(S,e); &
22、#160; / curpos=NextPos(e.seat,e.di); /进行探索 whi
23、le(!StackEmpty(S)&&!found);DestroyStack(S);return found; /将标记路径信息的迷宫(字符型方阵)输出到终端(包括外墙)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"); /系统初始化void Initialization()system("cls"); printf(" welcome to the game! "); printf(
25、"n*");printf("n*创建迷宫-c 执行迷宫-m 输出迷宫-p 退出-q*");printf("n*");printf("nn 操作:-"); /读入操作命令符,显示提示信息void ReadCommand(char &cmd) do if(cmd='c') printf("n*");
26、160; printf("n*选择操作 :执行迷宫-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*选择操作 :执行迷宫-c *"); printf("
29、n* 退出-:q *"); printf("n*"); printf("nn 操作:-"); cmd=getchar();while(!(cmd=
30、9;c'|cmd='m'|cmd='p'|cmd='q'); /解释cmd-具体执行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请输入迷宫数据文件名!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请输入迷宫入口的坐标,以空格为间隔:-"); scanf("%d %d",&start.r,&start.c); printf("n请输入迷宫出口的坐标,以空格为间隔:-"); scanf("%d %d",&end.r,&end.c); MazePath(maze, start, end); break; case 'p':
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国网江西省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(巩固)
- 2026国网黑龙江省电力公司高校毕业生提前批招聘(约450人)笔试备考题库浓缩500题含答案详解(培优a卷)
- 2026国网河南省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题及完整答案详解一套
- 2026秋季国家管网集团共享运营分公司高校毕业生招聘考试参考题库(浓缩500题)及完整答案详解1套
- 2026秋季国家管网集团北方管道公司高校毕业生招聘笔试参考题库(浓缩500题)及答案详解【名校卷】
- 国家管网集团山东分公司2026届秋季高校毕业生招聘考试备考试题(浓缩500题)带答案详解(达标题)
- 2026秋季国家管网集团浙江省天然气管网有限公司高校毕业生招聘笔试模拟试题(浓缩500题)附答案详解(考试直接用)
- 2026秋季国家管网集团山东分公司高校毕业生招聘笔试备考题库(浓缩500题)附答案详解(轻巧夺冠)
- 2026国网内蒙古高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题附答案详解(培优)
- 2026国家管网集团广西公司秋季高校毕业生招聘考试参考题库(浓缩500题)含答案详解ab卷
- 广西普通高考信息管理平台考生端-Web
- 起重机 钢丝绳 保养、维护、检验和报废
- 巨细胞病毒感染的实验室检查课件
- 建筑基底可控减压排水抗浮施工工法
- 制药空调净化系统基础培训-课件
- 雪茄培训雪茄知识学习课件
- 高压电位治疗便秘、失眠慢性疼痛疲劳的临床观察
- 噪声应激对家禽的影响机制及防治措施
- GB/T 622-2006化学试剂盐酸
- 行政大楼安保服务方案
- 梅岭三章一等奖(课件)
评论
0/150
提交评论