1、问题描述:
把一只老鼠从一个无顶盖的大盒子(迷宫)的入口处赶进迷宫。迷宫中设置了很多墙壁,对前进方向形成了多处障碍。在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以达到出口。
如果从迷宫的入口到达出口,途中不出现行进方向错误,则得到一条最佳路线。我们利用非递归方法获得迷宫从入口到出口的最佳路线。
二、需求分析:
【基本需求】
1)设置可选择的入口及出口,具有良好的界面以便用户操作。
2)自动生成迷宫,迷宫中用不同的符号标志代表墙壁和通路。
3)利用非递归算法实现,并输出有无通路两种情况下的迷宫路径,便于用户查看。
【简单分析】
1)本程序中定义了三个二维数组。一个迷宫数组,两个标记数组。对它们进行相同的初始化。
2)程序使用create()函数,系统自动创建一个大小确定的迷宫,该迷宫有a、b、c、d四个门。任何两个门之间是否存在路径不能确定,系统自动分配。
入口截图:3)输出的形式:
在有无通路时使用两种不同的标记路径方式,有通路时采用图形输出,无通路时则采用标记数组maze[表示。
有通路的路径截图:
无通路的路径截图:
三、概要设计:
1、数据结构的设计。
首先,在寻找迷宫路径的时候,当走到某一位置而不能再前进时,就需要后退。因此,我们需要用“栈”的思想来满足这一要求。
其次,当成功找到路径时,我们需要用图形输出迷宫。在输出路径时每个点之间必须要有联系,所以我们又用了“链表”的思想。
最后, 结合以上两点,在本程序中,我们应用了“链式栈”的思想,用以解决存放迷宫路径以及输出路径的问题。
2、算法的设计。
1)创建迷宫:
用二维数组maze[m+2][n+2]来表示迷宫矩阵,当数组元素maze[i][j]=1时,表示该位置是墙壁, 不能通行;当数组元素maze[i][j]=0时,表示该位置是通路。(1im)(1jn)
数组的第0行、第m+1行、第0列、第n+1列是迷宫的围墙。 建立过程中调用库函数 rand(),产生随机数,从而自动生成迷宫。
2)路径查找:
使用链式栈来存储在试探的过程中所走过的路径。一旦需要回退,可以从栈中取得刚才走过位置的坐标和前进方向。如果某个前进方向走不通,则将位于栈顶的活动记录退栈,使得在前进路径上回退一步,再尝试其他的允许方向,直至找到出口为止(有通路)。
如果栈空则表示已经退回到开始位置(无通路)。
3)路径输出:
有路径时,用标记数组mark[输出。mark[数组中各元素的值与迷宫数组maze[完全相同,此时我们采用图形输出。
具体算法如下所示:
假定p、q为指向point的指针,p指向当前位置,q指向下一位置。
当 p->row > q->row 时,输出↓;
当 p->row < q->row 时,输出↑;
当 p->col > q->col 时, 输出→;
当 p->col < q->col 时, 输出←;
没有路径时,用标记数组maze[输出。由于当没有找到通路时,栈内元素退栈并删除内存空间。因此,我们用maze[数组来存放所有走过的点用以输出。
4)主函数:
在该函数中,我们用了一个while循环贯穿整个函数。用于能够多次进行寻找迷宫路径。
迷宫系统功能模块图。
4、详细设计:
1)定义三元组结构:
typedef struct point
int row ;
int col;
struct point *next;
point;
int mark[m+2][n+2];
int maze[m+2][n+2];
2)成员函数流程图:
1 创建迷宫:create()
2 路径查找:mazepath()
3 路径输出:print2()
3)主函数流程图:
五、实现与测试。
1.调试过程中遇到的问题。
1)输出问题。
问题解决前:
如上图所示,有图可发现迷宫中的通路不易查找;走过的路径标记不明显,而且也没有标记清楚走的过程。因此,在迷宫及路径输出时,我们通过图形输出,以达到标记走路径的过程。如下图所示:
问题解决后:
2)查找路径问题。
问题解决前:
如上图所示,选定入口为a,出口为d。由图可以发现,在走的过程中,走法太过死板。因此,当选定入口和出口后,我们规定了判断上下左右四个方向的先后判断顺序。
以减少走的步骤。如下图所示:
问题解决后:
2.测试数据及输出结果。
(1) 输入正确数据及输出的结果。
有路径的情况。
选择入口为a,出口为d。则结果如下图所示:
★ 没有路径的情况。
选择入口为c,出口为b。则结果如下图如所示:
2) 输入错误数据及输出的结果。
3. 算法的时空分析及改进设想。
时间复杂度:o(m*n)
空间复杂度:不确定。
4. 源**及运行结果。
#include <>
#include <>
#include <>
#include <>
#include ""
#define m 10
#define n 10
typedef struct point //定义三元组结构类。
int row; /行。
int col; /列。
struct point *next; /前进方向 }point;
point* stack; /定义一个存储三元组的链式栈。
int mark[m+2][n+2]; int maze[m+2][n+2]; 标记数组。
void create(int maze[n+2])/建立迷宫。
int i,j;
srand( (unsigned)time( null ) 产生随机种子。
for(i = 0;i <=m+1;i++)
for(j = 0;j <=n+1;j++)
maze[i][j] =1;mark[i][j] =1;maze[i][j] =1; }
for(i = 1;i <=m;i++)
for(j = 1;j <=n;j++)
maze[i][j] =0;mark[i][j] =0;maze[i][j] =0; }
int c,i1,j1;
for(c = 1;c <=m*n;c++)
for(i = 1;i <=m;i++)
for(j = 1;j <=n;j++)
maze[i][j] =mark[i][j] =maze[i][j];
maze[1][1] =maze[1][n] =maze[m][1] =maze[m][n] =0; maze[1][0] =10; maze[1][n+1] =11;maze[m][0] =12;maze[m][n+1] =13; }
void print(int maze[n+2打印迷宫。
int i,j;
cout<<"n迷宫★" for(i = 0;i <=m+1;i++) int mazepath(int maze[n+2],int x1,int y1,int x2,int y2) if( x1 ==1 &&y1 ==1 &&x2 ==m &&y2 ==1){ point *p;int k = 2; if(maze[x1][y1] =0) { p = new (point);p->row = x1;p->col = y1; p->next = null;stack = p; /将入口放入链式栈。 maze[stack->row][stack->col] =maze[stack->row][stack->col] =k; k++;标志入口已访问。 while((!stack->row ==null &&stack->col ==null)) stack->row ==x2 &&stack->col ==y2)))未找到出口并且栈不空。 {if(maze[stack->row+1][stack->col] =0)//下面可通。 洛阳理工学院。课程设计说明书。课程名称。设计课题。专业。班级。学号。姓名。完成日期2014年12月26日。问题描述 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的内容要求。基本要求 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的基本要求。测试数据 小四宋体,行间距单倍行距,每... 课程设计总结,课程设计报告。3.尝试应用项目管理软件进行项目进程的规划管理 绘制甘特图,不作硬性要求 二 选题说明。人事管理是企业信息管理的重要部分,面对大量的人事工资信息,财务部门采用人力处理将浪费大量的时间 人力和物力,且数据的准确性低。因此,开发一个界面友好,易于操作的人事工资管理软件进行自动... 学校名。课程设计报告。课程名称 c语言程序设计 系别 专业班级 学号。姓名。课程题目 企业人事管理系统 完成日期 指导老师 年月日。附件。课程设计的内容。企业人事管理系统 本项目的目标是开发一个功能实用,操作简便,简单明了的人事管理系统。能够录入人事的基本资料,在操作上能够完成诸如添加 修改 删除 ...课程设计报告格式 课程设计
课程设计总结,课程设计报告
课程设计 课程设计报告格式