数据结构 迷宫求解问题 课程设计.docx

上传人:b****4 文档编号:12351905 上传时间:2023-04-18 格式:DOCX 页数:18 大小:143.48KB
下载 相关 举报
数据结构 迷宫求解问题 课程设计.docx_第1页
第1页 / 共18页
数据结构 迷宫求解问题 课程设计.docx_第2页
第2页 / 共18页
数据结构 迷宫求解问题 课程设计.docx_第3页
第3页 / 共18页
数据结构 迷宫求解问题 课程设计.docx_第4页
第4页 / 共18页
数据结构 迷宫求解问题 课程设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构 迷宫求解问题 课程设计.docx

《数据结构 迷宫求解问题 课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构 迷宫求解问题 课程设计.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构 迷宫求解问题 课程设计.docx

数据结构迷宫求解问题课程设计

江西理工大学应用科学学院

 

数据结构课程设计报告

 

题目:

迷宫求解

班级:

姓名:

学号:

完成日期:

 

 

一、课程设计概述…………………………………………………………………..2

二、问题描述……………………………………………………………………….2

三、需求分析……………………………………………………………………….2

四、概要设计……………………………………………………………………….2

五、存储结构……………………………………………………………………….4

六、流程图………………………………………………………………………...4

七、详细设计……………………………………………………………………….4

八、调试分析………………………………………………………………………..8

九、运行结果及分析……………………………………………………………….8

十、参考文献……………………………………………………………………….10

十一、主程序……………………………………………………………………..…10

 

一、课程设计概述

本次数据结构课程设计主要完成用栈来实现迷宫求解问题。

使用语言:

C

编译环境:

VC6.0

二、问题描述

迷宫问题是取自心理学的一个古典实验。

在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。

盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。

对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。

老鼠经过多次试验最终学会走通迷宫的路线。

设计一个计算机程序对任意设定的矩形迷宫如下图A所示,求出一条从入口到出口的通路,或得出没有通路的结论。

   

图1-1.

三、需求分析

要求设计程序输出如下:

(1)建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来;

(2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。

(3)用一种标志(如数字8)在迷宫中标出该条通路;

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

(5)上述功能可用菜单选择。

四、概要设计

设定栈的抽象数据类型定义为:

ADTstack{

数据对象:

D={ai|ai∈charset,i=1,2,……,n,n≥0}

数据关系:

R1={|ai-1,ai∈D,i=2……,n}

基本操作:

InitStack(&S)

//操作结果:

构造一个空栈S。

DestroyStack(&S)

//初始条件:

栈S已存在。

//操作结果:

销毁栈S。

ClearStack(&S)

//初始条件:

栈S已存在。

//操作结果:

将S清为空栈。

StackLength(&S)

//初始条件:

栈S已存在。

//操作结果:

返回栈S的长度。

StackEmpty(&S)

//初始条件:

栈S已存在。

//操作结果:

若S为空栈,则返回TRUE,否则返回FALSE。

GetTop(S,&e)

//初始条件:

栈S已存在。

//操作结果:

若栈S不空,则以e返回栈顶元素。

Push(&S,e)

//初始条件:

栈S已存在。

//操作结果:

在栈S的栈顶插入新的栈顶元素e。

Pop(&S,&e)

//初始条件:

栈S已存在。

//操作结果:

删除S的栈顶元素,并以e返回其值。

StackTraverse(S,visit())

//初始条件:

栈S已存在。

//操作结果:

从栈底到栈顶依次对S中的每个元素调用函数visit().

}ADTstack

五.存储结构

structpoint{

introw;//通道块在路径上的“行”位置

intcol;//迷宫的“出口”

Intpredecessor;//该通道的“前趋”

}queue[512];

六、流程图

图1-2

七、详细设计

实现概要设计中定义的所有数据类型及操作的伪代码算法

1.节点类型和指针类型

迷宫矩阵类型:

intmaze[M+2][N+2];为方便操作使其为全局变量

迷宫中节点类型及队列类型:

structpoint{introw,col,predecessor}que[512]

2.迷宫的操作

(1)手动生成迷宫

voidshoudong_maze(intm,intn)

{定义i,j为循环变量

for(i<=m)

for(j<=n)

输入maze[i][j]的值

}

(2)自动生成迷宫

voidzidong_maze(intm,intn)

{定义i,j为循环变量

for(i<=m)

for(j<=n)

maze[i][j]=rand()%2//由于rand()产生的随机数是从0到RAND_MAX,RAND_MAX是定义在stdlib.h中的,其值至少为32767),要产生从X到Y的数,只需要这样写:

k=rand()%(Y-X+1)+X;

}

(3)打印迷宫图形

voidprint_maze(intm,intn)

{用i,j循环变量,将maze[i][j]输出□、■}

(4)打印迷宫路径

voidresult_maze(intm,intn)

{用i,j循环变量,将maze[i][j]输出□、■、☆}

(5)搜索迷宫路径

①迷宫中队列入队操作

voidenqueue(structpointp)

{将p放入队尾,tail++}

②迷宫中队列出队操作

structpointdequeue(structpointp)

{head++,返回que[head-1]}

③判断队列是否为空

intis_empty()

{返回head==tail的值,当队列为空时,返回0}

④访问迷宫矩阵中节点

voidvisit(introw,intcol,intmaze[41][41])

{建立新的队列节点visit_point,将其值分别赋为row,col,head-1,maze[row][col]=2,表示该节点以被访问过;调用enqueue(visit_point),将该节点入队}

⑤路径求解

voidmgpath(intmaze[41][41],intm,intn)

{先定义入口节点为structpointp={0,0,-1},从maze[0][0]开始访问。

如果入口处即为障碍,则此迷宫无解,返回0,程序结束。

否则访问入口节点,将入口节点标记为访问过maze[p.row][p.col]=2,调用函数enqueue(p)将该节点入队。

判断队列是否为空,当队列不为空时,则运行以下操作:

{调用dequeue()函数,将队头元素返回给p,

如果p.row==m-1且p.col==n-1,即到达出口节点,即找到了路径,结束

如果p.col+1

如果p.row+1

如果p.col-1>0且maze[p.row][p.col-1]==0,说明未到迷宫左边界,且其左方有通路,则visit(p.row,p.col-1,maze),将左方节点入队标记已访问

如果p.row-1>0且maze[p.row-1][p.col]==0,说明未到迷宫上边界,且其上方有通路,则visit(p.row,p.col+1,maze),将上方节点入队标记已访问

}

访问到出口(找到路径)即p.row==m-1且p.col==n-1,则逆序将路径标记为3即maze[p.row][p.col]==3;

while(p.predecessor!

=-1)

{p=queue[p.predecessor];

maze[p.row][p.col]==3;}

最后将路径图形打印出来。

3.菜单选择

while(cycle!

=(-1))

☆手动生成迷宫请按:

1

☆自动生成迷宫请按:

2

☆退出请按:

3

scanf("%d",&i);

switch(i)

{case1:

请输入行列数(如果超出预设范围则提示重新输入)

shoudong_maze(m,n);

print_maze(m,n);

mgpath(maze,m,n);

if(X!

=0)result_maze(m,n);

case2:

请输入行列数(如果超出预设范围则提示重新输入)

zidong_maze(m,n);

print_maze(m,n);

mgpath(maze,m,n);

if(X!

=0)result_maze(m,n);

case3:

cycle=(-1);break;

}

注:

具体源代码见附录

八、调试分析

在调试过程中,首先使用的是栈进行存储,但是产生的路径是多条或不是最短路径,所以通过算法比较,改用此算法。

九、运行结果及分析

1.程序主界面

图1-3

2.手动输入迷宫

图1-4

图1-5

3.自动生成迷宫

图1-6

图1-7

十、参考文献

[1]浩谭强.C程序设计[M]第2版.北京:

清华大学出版社,2004年。

[2]蔚严敏、吴伟民.数据结构[M].北京:

清华大学出版社,2OO5年。

十一、主程序

附录:

#include"stdlib.h"

#include"stdio.h"

#defineN39

#defineM39

intX;

intmaze[N+2][M+2];

structpoint{

introw,col,predecessor;

}queue[512];

inthead=0,tail=0;

voidshoudong_maze(intm,intn){

inti,j;

printf("\n\n");

printf("请按行输入迷宫,0表示通路,1表示障碍:

\n\n");

for(i=0;i

for(j=0;j

scanf("%d",&maze[i][j]);

}

voidzidong_maze(intm,intn){

inti,j;

printf("\n迷宫生成中……\n\n");

system("pause");

for(i=0;i

for(j=0;j

maze[i][j]=rand()%2;

//由于rand()产生的随机数是从0到RAND_MAX

//RAND_MAX是定义在stdlib.h中的,其值至少为32767)

//要产生从X到Y的数,只需要这样写:

k=rand()%(Y-X+1)+X;

}

voidprint_maze(intm,intn){

inti,j;

printf("\n迷宫生成结果如下:

\n\n");

printf("迷宫入口\n");

printf("↓");

for(i=0;i

{printf("\n");

for(j=0;j

{if(maze[i][j]==0)printf("□");

if(maze[i][j]==1)printf("■");}

}

printf("→迷宫出口\n");

}

voidresult_maze(intm,intn){

inti,j;

printf("迷宫通路(用☆表示)如下所示:

\n\t");

for(i=0;i

{printf("\n");

for(j=0;j

{if(maze[i][j]==0||maze[i][j]==2)printf("□");

if(maze[i][j]==1)printf("■");

if(maze[i][j]==3)printf("☆");

}

}

}

voidenqueue(structpointp){

queue[tail]=p;

tail++;

}

structpointdequeue(){

head++;

returnqueue[head-1];

}

intis_empty(){

returnhead==tail;

}

voidvisit(introw,intcol,intmaze[41][41]){

structpointvisit_point={row,col,head-1};

maze[row][col]=2;

enqueue(visit_point);

}

intmgpath(intmaze[41][41],intm,intn){

X=1;

structpointp={0,0,-1};

if(maze[p.row][p.col]==1)

{printf("\n===============================================\n");

printf("此迷宫无解\n\n");X=0;return0;}

maze[p.row][p.col]=2;

enqueue(p);

while(!

is_empty())

{p=dequeue();

if((p.row==m-1)&&(p.col==n-1))break;

if((p.col+1

if((p.row+1

if((p.col-1>=0)&&(maze[p.row][p.col-1]==0))visit(p.row,p.col-1,maze);

if((p.row-1>=0)&&(maze[p.row-1][p.col]==0))visit(p.row-1,p.col,maze);

}

if(p.row==m-1&&p.col==n-1)

{printf("\n==================================================================\n");

printf("迷宫路径为:

\n");

printf("(%d,%d)\n",p.row,p.col);

maze[p.row][p.col]=3;

while(p.predecessor!

=-1)

{p=queue[p.predecessor];

printf("(%d,%d)\n",p.row,p.col);

maze[p.row][p.col]=3;

}

}

else{printf("\n=============================================================\n");

printf("此迷宫无解!

\n\n");X=0;}

return0;

}

voidmain()

{inti,m,n,cycle=0;

while(cycle!

=(-1))

{

printf("********************************************************************************\n");

printf("欢迎进入迷宫求解系统\n");

printf("\n");

printf("********************************************************************************\n");

printf("☆手动生成迷宫请按:

1\n");

printf("☆自动生成迷宫请按:

2\n");

printf("☆退出请按:

3\n\n");printf("********************************************************************************\n");

printf("\n");

printf("请选择你的操作:

\n");

scanf("%d",&i);

switch(i)

{case1:

printf("\n请输入行数:

");scanf("%d",&m);

printf("\n");

printf("请输入列数:

");scanf("%d",&n);

while((m<=0||m>39)||(n<=0||n>39))

{printf("\n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:

\n\n");

printf("请输入行数:

");scanf("%d",&m);

printf("\n");

printf("请输入列数:

");scanf("%d",&n);

}shoudong_maze(m,n);

print_maze(m,n);

mgpath(maze,m,n);

if(X!

=0)result_maze(m,n);

printf("\n\nPressEnterContiue!

\n");getchar();while(getchar()!

='\n');break;

case2:

printf("\n请输入行数:

");scanf("%d",&m);

printf("\n");

printf("请输入列数:

");scanf("%d",&n);

while((m<=0||m>39)||(n<=0||n>39))

{printf("\n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:

\n\n");

printf("请输入行数:

");scanf("%d",&m);

printf("\n");

printf("请输入列数:

");scanf("%d",&n);

}

zidong_maze(m,n);

print_maze(m,n);

mgpath(maze,m,n);

if(X!

=0)result_maze(m,n);

printf("\n\nPressEnterContiue!

\n");getchar();while(getchar()!

='\n');break;

case3:

cycle=(-1);break;

default:

printf("\n");printf("你的输入有误!

\n");

printf("\nPressEnterContiue!

\n");getchar();while(getchar()!

='\n');break;

}

}

}

答辩与成绩考核

答辩问答

成绩评定

项目

权重

成绩

1、设计过程中出勤、能力、水平、态度等方面

2、课设书写及作品质量程度

3、答辩

4、系统

总成绩

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1