迷宫设计

更新时间:2023-08-26 13:19:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目录

第一节 课程设计的题目及目的 ........................... 1

第二节 课程设计内容和要求 ............................ 1

2.1设计内容 ........................................... 1

2.2设计要求 ........................................... 2

第三节 课程设计方案及分析 ............................ 2

3.1问题分析 ........................................... 2

3.1.1 迷宫的建立 ..................................... 2

3.1.2 迷宫的存储 ..................................... 2

3.1.3 迷宫路径的搜索 .................................. 3

3.1.4 流程图 ......................................... 3

3.2 概要设计 ........................................... 5

3.3 详细设计 ........................................... 5

第四节 源程序 .......................................... 6

第五节 测试结果 ........................................ 10

5.1 错误输入 .......................................... 10

5.2正确路径 .......................................... 10

第六节 课程设计总结 ................................. 11

第七节 参考文献 ........................................ 11

第一节 课程设计的题目及目的

这次课程设计,我们的题目是迷宫求解。迷宫求解是数据结构中的经典问题,我期望达到的目的有四个:

1) 巩固书本知识,对书上的知识能更透彻地了解。

通过自己设计程序积累调试数据结构的经验,培养我们的编程能力。巩

固我们所学的数据结构知识,消化课堂所讲解的内容。也是对所学知识的

一次整理,将原本在我们脑中比较混乱的课程设计重新梳理。

2) 通过课程设计能够更好的掌握迷宫求解中的设计思路为以后灵活运用奠定

基础。

3) 能够独立的完成简单程序的设计以及完成一份较为满意的程序设计报告

第二节 课程设计内容和要求 2.1设计内容

迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无

顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫,求出一条从入口到出口的通路,或得出没有通路的结果。

2.2设计要求

(1) 建立一个大小为m×m的任意迷宫(迷宫数据可由用户输入或由程序自动生

成),并在屏幕上显示出来

(2) 在屏幕上输出迷宫和通路

第三节 课程设计方案及分析

3.1问题分析

3.1.1 迷宫的建立

迷宫中存在通路和障碍,为了方便迷宫的创建,可用0表示通路,用1表示障碍,#表示墙壁,这样迷宫就可以用0、1矩阵来描述,

3.1.2 迷宫的存储

迷宫是一个矩形区域,可以使用二维数组表示迷宫,这样迷宫的每一个位置都可 以用其行列号来唯一指定,但是二维数组不能动态定义其大小,我们可以考虑先 定义一个较大的二维数组maze[M+2][M+2],然后用它的前m行m列来存放元素,即可得到一个m×m的二维数组,这样(0,0)表示迷宫入口位置,(m-1,m-1)表示迷宫出口位置。

3.1.3 迷宫路径的搜索

首先从迷宫的入口开始,如果该位置就是迷宫出口,则已经找到了一条路径,搜 索工作结束。否则搜索其上、下、左、右位置是否是障碍,若不是障碍,就移动到该位置,然后再从该位置开始搜索通往出口的路径;若是障碍就选择另一个相邻的位置,并从它开始搜索路径。为防止搜索重复出现,则将已搜索过的位置用函数进行判断和标记,同时保留搜索痕迹,在考虑进入下一个位置搜索之前,将当前位置保存在一个队列中,如果所有相邻的非障碍位置均被搜索过,且未找到通往出口的路径,则表明不存在从入口到出口的路径。这实现的是广度优先遍历的算法如果找到路径,则最短路径。

3.1.4 流程图

4

3.2 概要设计

1.①构建一个二维数组maze[M+2][M+2]用于存储迷宫矩阵

②自动或手动生成迷宫,即为二维数组maze[M+2][M+2]赋值

③构建一个队列用于存储迷宫路径

④建立迷宫节点,用于存储迷宫中每个节点的访问情况

⑤实现搜索算法

⑥屏幕上显示操作菜单

2.本程序包含12个函数:

(1)主函数 main()

(2)Status InitStack(); //创建一个空栈S

(3)Status Push(); //插入新元素a

(4)Status Pop();//删除栈顶元素,a返回其值

(5)Status StackEmpty();//检查是否空栈

(6)Status MazePath(); //找通路

(7)void Initmaze(); //初始化迷宫

(8)void printmaze(); //显示迷宫

(9)Status Pass();/判断当前位置是否可通

(10)void Markfoot(); //标记当前位置不可通

(11)PosType NextPos(); //进入下一位置

(12)void printpath(); //显示通路

3.3 详细设计

程序设计的基本思想,原理和算法描述:

此算法最大的优点是支持图形化输入与输出,观察效果好

迷宫求解问题主要运用了堆栈的性质

第四节 源程序

#define M2 12 /*M2*N2为实际使用迷宫数组的大小*/

#define N2 11

#define MAXLEN M2 /*栈的长度*/

#define True 1

#define False 0

# include “stdio.h”

#include<malloc.h>

int M=M2-2, N=N2-2; /*M*N为迷宫的大小*/

typedef struct /*定义栈元素的类型*/

{

int x,y,dir;

}elemtype;

typedef struct /* 定义顺序栈*/

{elemtype stack[MAXLEN];

int top;

}sqstktp;

struct moved /*定义方向位移数组的元素类型对于存储坐标增量的方向位移数组move*/

{

int dx,dy;

};

void inimaze(int maze[][N2]) /*初始化迷宫*/

{ int i,j,num;

for(i=1;i<=M;i++)

{for(j=1;j<=N;j++)

{num=(800*(i+j)+1500) %327; /*根据M和N值产生迷宫*/

if((num<150)&&(i!=M || j!=N))

maze[i][j]=1;

else

maze[i][j]=0;

printf(“%3d”, maze[i][j]); /*显示迷宫*/

}

printf(“\n”);

}

printf(“\n”);

for(i=0,j=0;i<=M+1;i++) /*设置迷宫的边界值*/

maze[i][j]=1;

for(i=0,j=N+1;i<=M+1;i++)

maze[i][j]=1;

for(i=0,j=0;j<=N+1;j++)

maze[i][j]=1;

for(i=M+1,j=0;j<=N+1;i++)

maze[i][j]=1;

} /*inimaze*/

void inimove(struct moved move[]) /*初始化方向位移数组*/

{

/* 依次为东E,东南SE,南S,西南SW,西W,西北NW,北N,东北NE*/. move[0].dx=0; move[0].dy=1;

move[1].dx=1; move[1].dy=1;

move[2].dx=1; move[2].dy=0;

move[3].dx=1; move[3].dy=-1;

move[4].dx=0; move[4].dy=-1;

move[5].dx=-1; move[5].dy= -1;

move[6].dx=-1; move[6].dy=0;

move[7].dx=-1; move[7].dy=1;

}

void inistack(sqstktp *s) /*初始化栈*/

{

s->top= -1;

}

int push(sqstktp *s,elemtype x) /*数据元素x入指针s所指的栈*/

{ if(s->top==MAXLEN-1) /*栈满,返回False */

return(False);

else

{ s->stack[++s->top]=x; /*栈不满,执行入栈操作 */

return(True);

}

}

elemtype pop(sqstktp *s) /*栈顶元素出栈*/

{ elemtype elem;

if (s->top<0) /*如果栈空,返回空值*/

{elem.x = Null;

elem.y = Null;

elem.dir = Null;

return(elem);

}

else

{ s->top- - ;

retrun(s->stack[s->top+1]); /*如果栈不空,返回栈顶元素值*/ }

}

void path(int maze[][N2],struct moved move[],sqstktp *s)

/*寻找迷宫中的一条通路*/

{int i, j, dir, x, y, f;

elemtype elem;

i=1; j=1; dir=0;

maze[1][1] = -1; /*设[1][1]为入口处*/

do

{ x=i+move[dir].dx; /*求下一步可行的到达点的坐标*/ y=j+move[dir].dy;

if(maze[x][y]= =0)

{elem.x = i; elem.y = j; elem.dir = dir;

f=push(s, elem); /*如果可行,将此点数据入栈*/

if(f = =False) /*如果入栈操作返回假,说明栈容量不够*/

printf(栈长度太短\n);

i=x; j=y; dir=0; maze[x][y]= -1; /*走过的位置设为-1 */

}

else

if(dir<7) /*如果当前方向不可行,就转到下一个方向*/

dir++;

else

{elem = pop(s); /*8个方向都不可行,就转到下一个方向*/

if(elem.x!=Null)

{i=elem.x; j=elem.y; dir=elem.dir+1;}

}

}while(!((s->top= = -1)&&(dir>=7)|| (x= =M)&&(y= =N)&&(maze[x][y]= = -1))); /*循环,直到入口处或出口处为止*/

if (s->top= =-1) /*如果是入口处,则迷宫无通路*/

printf(“此迷宫无通路\n”);

else

{ elem.x = x; elem.y = y; elem.dir = dir; /*将最后出口处的坐标压入栈中*/

f= push(s,elem);

printf(“迷宫通路是:\n”);

i= 0;

while (i<=s->top)

{printf(“%d, %d”, s->stack[i].x , s->stack[i].y ); /*显示迷宫通路*/

if (i!=s->top)

printf(“-->”);

if((i+1)%4= =0)

printf(“\n”);

i++;

}

printf(“\n”);

}

}

void draw(int maze[][N2], sqstktp *s) /*在迷宫中绘制出通路*/

{ int i, j;

elemtype elem;

for(i =1; i<=M; i++) /*将迷宫中全部的-1值恢复为0值*/

for(j =1;j<=N; j++)

if (maze[i][j]= = -1)

maze[i][j]= = 0;

while (s->top> -1) /*根据栈中元素的坐标,将通路的各个点的值改为-1*/ {elem = pop(s);

i = elem.x; j = elem.y;

maze[i][j]= = 8;

}

for(i =1; i<=M; i++)

{for(j =1;j<=N; j++)

printf(“%3d”, maze[i][j]);

printf(“\n”);

}

printf(“\n”);

}

void main()

{sqstktp *s;

int maze[M2][N2];

struct moved move[8];

inimaze(maze);

s=(sqstktp *p)malloc(sizeof(sqstktp));

inistack(s);

inimove(move);

path(maze, move, s);

draw(maze,s);

}

第五节 测试结果

5.1 错误输入

5.2正确路径

第六节 课程设计总结

通过这段时间的课程设计,本人对软件专业的应用,数据结构的作用以及C语言的使用都有了更深的了解。尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。

在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。

时间过得真快,大学生活不知不觉就走过了三年,三年的大学学习和课程实践阶段的提高,使我们本身知识得到提高的同时,也增强了我们对未来工作的信心,我们相信自己未来三年的学习更使我们有能力胜任将来的工作。

第七节 参考文献

1. 谭浩强 <<C 程序设计 >>[M]. 北京:清华大学出版社, 2006.

2. 严蔚敏 <<数据结构(C语言版)>>[M]. 北京:清华大学出版社

3. 王华 , 叶爱亮 等 .<<Visual C++6.0 编程实例与技巧 >>[M]. 北京:机械工业出版社

4. 钱新贤 ,程兆炜等 .<<Visual C++ 编程疑难详解>> [M]. 北京:人民邮电出版社,2000.

本文来源:https://www.bwwdw.com/article/8z1i.html

Top