课程设计报告

发布 2022-10-01 04:04:28 阅读 5960

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语言程序设计 系别 专业班级 学号。姓名。课程题目 企业人事管理系统 完成日期 指导老师 年月日。附件。课程设计的内容。企业人事管理系统 本项目的目标是开发一个功能实用,操作简便,简单明了的人事管理系统。能够录入人事的基本资料,在操作上能够完成诸如添加 修改 删除 ...