数据结构实验报告---迷宫问题--葛晨阳

数据结构课程设计

设计题目: 迷宫问题

学 院: 信息技术学院

专 业: 网络工程

班 级: B1204

学 号: 0913120419

姓 名: 葛晨阳

指导老师: 戴玉洁

课程设计日期: 2013年 7月 20日— 2013年 8月日 1

实验题目

一、问题描述

输入一个任意大小的迷宫数据,用递归和非递归两种方法求出一条走出迷宫的路径,并将路径输出。

二、实现目标

综合运用递归、栈等数据结构知识,掌握、提高分析、设计、实现及测试程序的综合能力

三、主要功能模块及实现功能

(创建一顺序栈:

PSeqStack Init_SeqStack(void)

判断栈是否为空:

int Empty_SeqStack(PSeqStack S)

在栈顶插入一新元素x :

int Push_SeqStack (PSeqStack S, DataType x)

删除栈顶元素并保存在*x :

int Pop_SeqStack(PSeqStack S ,DataType *x)

销毁栈 :

void Destroy_SeqStack(PSeqStack *S)

利用栈的非递归算法求迷宫路径:

int mazepath(int maze [ ][n+2] ,item move[ ],int x0,int y0)

递归算法求迷宫路径:

int mazepath1(int maze[][n+2],item move[],int x,int y)

主函数:

int main()

{ 出口坐标已定,

利用while 循环多次输入入点坐标,

调用mazepath(int maze [ ][n+2] ,item move[ ],int x0,int y0)

输出可走的路径

}

四、主要模块流程图

五、实验结果及测试数据

初始界面

游戏界面

游戏界面

附录:源代码

#include

#include

#define m 6

#define n 8

#define MAXSIZE 100

int maze[m+2][n+2]={

{1,1,1,1,1,1,1,1,1,1},//四周为1代表围墙,0为可走路径

{1,0,0,1,1,0,0,0,1,1},

{1,0,0,0,0,1,1,1,1,1},

{1,0,1,0,0,0,0,0,1,1},

{1,0,1,1,1,0,0,1,1,1},

{1,1,0,0,1,1,0,0,0,1},

{1,0,1,0,0,0,1,1,0,1},

{1,1,1,1,1,1,1,1,1,1}

}; //入口坐标为(1,1),出口坐标为(6,8)

typedef struct

{

int x,y;/*试探方向*/

}item;

item move[4]={{0,1},{1,0},{0,-1},{-1,0}};

typedef struct/*栈的设计*/

{

int x,y,d; /*纵横坐标及方向*/

}DataType;

typedef struct/*栈*/

{

DataType data[MAXSIZE];

int top;

}SeqStack,*PSeqStack;

PSeqStack Init_SeqStack(void)

{ /*创建一顺序栈,入口参数无,返回一个指向顺序栈的指针,为零表示分配空间失败*/

PSeqStack S;

S=(PSeqStack)malloc(sizeof(SeqStack));

if (S)

S->top= -1;

return S;

}

int Empty_SeqStack(PSeqStack S)

{ /*判断栈是否为空,入口参数:顺序栈,返回值:1表示为空,0表示非空*/ if (S->top== -1)

return 1;

else

return 0;

}

int Push_SeqStack (PSeqStack S, DataType x)

{ /*在栈顶插入一新元素x , 入口参数:顺序栈,返回值:1表示入栈成功,0表示失败。*/

if (S->top==MAXSIZE-1)

return 0; /*栈满不能入栈*/

else

{

S->top++;

S->data[S->top]=x;

return 1;

}

}

int Pop_SeqStack(PSeqStack S ,DataType *x)

{ /*删除栈顶元素并保存在*x, 入口参数:顺序栈,返回值:1表示出栈成功,0表示失败。*/

if (Empty_SeqStack ( S ) )

return 0; /*栈空不能出栈 */

else

{

*x= S->data[S->top];

S->top--;

return 1;

}

}

void Destroy_SeqStack(PSeqStack *S)

{

if(*S)

free(*S);

*S=NULL;

return;

}

/*利用栈的非递归算法*/

int mazepath(int maze [ ][n+2] ,item move[ ],int x0,int y0)

{ /*求迷宫路径, 入口参数:指向迷宫数组的指针,下标移动的增量数组,开始点(x0,y0),到达点(m ,n ), 返回值:1表示求出路径,0表示无路径*/

PSeqStack S ;

DataType temp ;

int x, y, d, i, j ;

temp.x=x0 ;temp.y=y0 ; temp.d=-1 ;

S=Init_SeqStack(); /*初始化栈*/

if (!S)

{ printf("栈初始化失败");

return(0);

}

Push_SeqStack (S,temp) ; /* 迷宫入口点入栈 */

while (! Empty_SeqStack (S ) )

{

Pop_SeqStack(S,&temp);

x=temp.x ; y=temp.y ; d=temp.d+1 ;

while (d

{

i=x+move[d].x ; j=y+move[d].y ;

if( maze[i][j]==0 ) /*此方向可走*/

{

temp.x=x;temp.y=y; temp.d=d;

Push_SeqStack ( S, temp ) ;/*点{x,y}可以走,用栈保存可以走的路径*/ x=i; y=j; maze[x][y]= -1;

if (x==m&&y==n) /*迷宫有路*/

{

while( !Empty_SeqStack(S) )

{

Pop_SeqStack (S,&temp) ;

printf("(%d,%d)

Destroy_SeqStack(&S); /*销毁栈*/

return 1 ;

}

else d=0 ;/*方向复位,从第一个方向开始试探*/

}

else d++ ;/*试探下一个方向*/

} /*while (d

} /*while */

Destroy_SeqStack(&S); /*销毁栈*/

return 0 ;/*迷宫无路*/

}

/*递归算法*/

int mazepath1(int maze[][n+2],item move[],int x,int y)

{/*求迷宫路径,入口参数:迷宫数组,下标移动的增量数组,开始点(x ,y ), 以及开始点对应的步数step ,(m,n )是终点,返回值:1表示求出路径,0表示无路径*/

int i;

int step=0;

step++;

maze[x][y]=step;

if(x==m&&y==n)

return 1; /*起始位置是出口,找到路径,结束*/ for(i=0;i

{

if(maze[x+move[i].x][y+move[i].y]==0)

if(mazepath(maze,move,x+move[i].x,y+move[i].y))

return 1; /*下一个是出口,则返回*/ }

step--;

maze[x][y]=0;

return 0;

}

int main()

{ int i,j,k;

char u;

int x,y;

printf("*****欢迎进入迷宫游戏*****\n");

printf("~~~~~~~~游戏快乐~~~~~~~~~\n");

printf(" 这是6*8的迷宫\n");

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

for(i=0;i

{ printf("****");

for(j=0;j

{

printf("%-2d",maze[i][j]);

}

printf("****");

printf("\n");

}

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

printf("现在开始游戏?(y/n):");

scanf("%c",&u);

while(u!='n')

{

printf("请输入迷宫入口坐标(x,y):");

scanf("%d,%d",&x,&y);

printf("出口:(6,8)

k=mazepath(maze,move,x,y);

printf(":入口\n");

if(k==1)printf("恭喜!走出迷宫\n\n");

else printf("抱歉,迷宫无路\n\n");

printf("继续游戏:");

scanf("%c",&u); printf("\n"); }

return 0; }

数据结构课程设计

设计题目: 迷宫问题

学 院: 信息技术学院

专 业: 网络工程

班 级: B1204

学 号: 0913120419

姓 名: 葛晨阳

指导老师: 戴玉洁

课程设计日期: 2013年 7月 20日— 2013年 8月日 1

实验题目

一、问题描述

输入一个任意大小的迷宫数据,用递归和非递归两种方法求出一条走出迷宫的路径,并将路径输出。

二、实现目标

综合运用递归、栈等数据结构知识,掌握、提高分析、设计、实现及测试程序的综合能力

三、主要功能模块及实现功能

(创建一顺序栈:

PSeqStack Init_SeqStack(void)

判断栈是否为空:

int Empty_SeqStack(PSeqStack S)

在栈顶插入一新元素x :

int Push_SeqStack (PSeqStack S, DataType x)

删除栈顶元素并保存在*x :

int Pop_SeqStack(PSeqStack S ,DataType *x)

销毁栈 :

void Destroy_SeqStack(PSeqStack *S)

利用栈的非递归算法求迷宫路径:

int mazepath(int maze [ ][n+2] ,item move[ ],int x0,int y0)

递归算法求迷宫路径:

int mazepath1(int maze[][n+2],item move[],int x,int y)

主函数:

int main()

{ 出口坐标已定,

利用while 循环多次输入入点坐标,

调用mazepath(int maze [ ][n+2] ,item move[ ],int x0,int y0)

输出可走的路径

}

四、主要模块流程图

五、实验结果及测试数据

初始界面

游戏界面

游戏界面

附录:源代码

#include

#include

#define m 6

#define n 8

#define MAXSIZE 100

int maze[m+2][n+2]={

{1,1,1,1,1,1,1,1,1,1},//四周为1代表围墙,0为可走路径

{1,0,0,1,1,0,0,0,1,1},

{1,0,0,0,0,1,1,1,1,1},

{1,0,1,0,0,0,0,0,1,1},

{1,0,1,1,1,0,0,1,1,1},

{1,1,0,0,1,1,0,0,0,1},

{1,0,1,0,0,0,1,1,0,1},

{1,1,1,1,1,1,1,1,1,1}

}; //入口坐标为(1,1),出口坐标为(6,8)

typedef struct

{

int x,y;/*试探方向*/

}item;

item move[4]={{0,1},{1,0},{0,-1},{-1,0}};

typedef struct/*栈的设计*/

{

int x,y,d; /*纵横坐标及方向*/

}DataType;

typedef struct/*栈*/

{

DataType data[MAXSIZE];

int top;

}SeqStack,*PSeqStack;

PSeqStack Init_SeqStack(void)

{ /*创建一顺序栈,入口参数无,返回一个指向顺序栈的指针,为零表示分配空间失败*/

PSeqStack S;

S=(PSeqStack)malloc(sizeof(SeqStack));

if (S)

S->top= -1;

return S;

}

int Empty_SeqStack(PSeqStack S)

{ /*判断栈是否为空,入口参数:顺序栈,返回值:1表示为空,0表示非空*/ if (S->top== -1)

return 1;

else

return 0;

}

int Push_SeqStack (PSeqStack S, DataType x)

{ /*在栈顶插入一新元素x , 入口参数:顺序栈,返回值:1表示入栈成功,0表示失败。*/

if (S->top==MAXSIZE-1)

return 0; /*栈满不能入栈*/

else

{

S->top++;

S->data[S->top]=x;

return 1;

}

}

int Pop_SeqStack(PSeqStack S ,DataType *x)

{ /*删除栈顶元素并保存在*x, 入口参数:顺序栈,返回值:1表示出栈成功,0表示失败。*/

if (Empty_SeqStack ( S ) )

return 0; /*栈空不能出栈 */

else

{

*x= S->data[S->top];

S->top--;

return 1;

}

}

void Destroy_SeqStack(PSeqStack *S)

{

if(*S)

free(*S);

*S=NULL;

return;

}

/*利用栈的非递归算法*/

int mazepath(int maze [ ][n+2] ,item move[ ],int x0,int y0)

{ /*求迷宫路径, 入口参数:指向迷宫数组的指针,下标移动的增量数组,开始点(x0,y0),到达点(m ,n ), 返回值:1表示求出路径,0表示无路径*/

PSeqStack S ;

DataType temp ;

int x, y, d, i, j ;

temp.x=x0 ;temp.y=y0 ; temp.d=-1 ;

S=Init_SeqStack(); /*初始化栈*/

if (!S)

{ printf("栈初始化失败");

return(0);

}

Push_SeqStack (S,temp) ; /* 迷宫入口点入栈 */

while (! Empty_SeqStack (S ) )

{

Pop_SeqStack(S,&temp);

x=temp.x ; y=temp.y ; d=temp.d+1 ;

while (d

{

i=x+move[d].x ; j=y+move[d].y ;

if( maze[i][j]==0 ) /*此方向可走*/

{

temp.x=x;temp.y=y; temp.d=d;

Push_SeqStack ( S, temp ) ;/*点{x,y}可以走,用栈保存可以走的路径*/ x=i; y=j; maze[x][y]= -1;

if (x==m&&y==n) /*迷宫有路*/

{

while( !Empty_SeqStack(S) )

{

Pop_SeqStack (S,&temp) ;

printf("(%d,%d)

Destroy_SeqStack(&S); /*销毁栈*/

return 1 ;

}

else d=0 ;/*方向复位,从第一个方向开始试探*/

}

else d++ ;/*试探下一个方向*/

} /*while (d

} /*while */

Destroy_SeqStack(&S); /*销毁栈*/

return 0 ;/*迷宫无路*/

}

/*递归算法*/

int mazepath1(int maze[][n+2],item move[],int x,int y)

{/*求迷宫路径,入口参数:迷宫数组,下标移动的增量数组,开始点(x ,y ), 以及开始点对应的步数step ,(m,n )是终点,返回值:1表示求出路径,0表示无路径*/

int i;

int step=0;

step++;

maze[x][y]=step;

if(x==m&&y==n)

return 1; /*起始位置是出口,找到路径,结束*/ for(i=0;i

{

if(maze[x+move[i].x][y+move[i].y]==0)

if(mazepath(maze,move,x+move[i].x,y+move[i].y))

return 1; /*下一个是出口,则返回*/ }

step--;

maze[x][y]=0;

return 0;

}

int main()

{ int i,j,k;

char u;

int x,y;

printf("*****欢迎进入迷宫游戏*****\n");

printf("~~~~~~~~游戏快乐~~~~~~~~~\n");

printf(" 这是6*8的迷宫\n");

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

for(i=0;i

{ printf("****");

for(j=0;j

{

printf("%-2d",maze[i][j]);

}

printf("****");

printf("\n");

}

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

printf("现在开始游戏?(y/n):");

scanf("%c",&u);

while(u!='n')

{

printf("请输入迷宫入口坐标(x,y):");

scanf("%d,%d",&x,&y);

printf("出口:(6,8)

k=mazepath(maze,move,x,y);

printf(":入口\n");

if(k==1)printf("恭喜!走出迷宫\n\n");

else printf("抱歉,迷宫无路\n\n");

printf("继续游戏:");

scanf("%c",&u); printf("\n"); }

return 0; }


相关内容

  • 迷宫问题数据结构实验报告
  • 数据结构实验报告 实习1 栈和队列及其应用 题目:迷宫问题 班级:1403011班 姓名:付尧 学号:[1**********] 完成日期:2015.11.25 一.需求分析 1.以二维数组maze[m][n]表示迷宫,再为周围加一圈障碍.数组以元素值为0表示通路,1表示障碍. 2.用户以文件的形式 ...

  • 智能小车实验报告
  • 北京邮电大学实习报告 附1 实习总结 为期两周的电子工艺实习,我过得十分忙碌和充实.从茫然地走进实验室,到学习最基本的焊接,到组装小车,再到无数次地调试程序,最后获得全院比赛的二等奖,有很多的辛苦,但是有更多的收获. 焊接是电子工艺实习最基本的部分,也是我们小学期的第一课.最开始是焊接基本的元件,包 ...

  • 迷宫机器人设计开题报告
  • 滨 州 学 院 毕业设计(论文)开题报告 题 目 基于AVR 单片机的迷宫机器人设计 系 (院) 自动化系 年级 2009 专 业 电气工程与自动化 班级 1班 学生姓名 王征飞 学号 [1**********] 指导教师 王志勇 职称 助教 滨州学院教务处 二〇一三 年 三 月 开题报告填表说明 ...

  • 迷宫问题2
  • 题目:假设迷宫由m行n列构成,有一个入口和一个出口,入口坐标为(1,1),出口坐标为 (m,n),试找出一条从入口通往出口的最短路径.设计算法并编程输出一条通过迷宫的最短路径或报告一个"无法通过"的信息. 要求:用栈和队列实现,不允许使用递归算法. 一. 需求分析 1. 用户可以 ...

  • 高架迷宫和Y迷宫
  • 高架十字迷宫(Elevated plus maze): (1)高架十字迷宫(High plus maze)是利用动物对新异环境的探究特性和对高悬敞开臂的恐惧形成矛盾冲突行为来考察动物的焦虑状态.高架十字迷宫具有一对开臂和一对闭臂,啮齿类动物由于嗜暗性会倾向于在闭臂中活动,但出于好奇心和探究性又会在开 ...

  • 迷宫问题课程设计报告
  • 湖南文理学院课程设计报告 课程名称: 计算机技术基础 系 部: 电气与信息工程学院 专业班级: 学 号:学生姓名:指导教师: 完成时间: 报告成绩: 迷宫通路问题 一.设计要求 通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合. (1).收集资料 ...

  • 人事测评理论与方法
  • 人事测评理论与方法 附:人力资源专业校园招 聘测评方案 一. 国内人事测评理论与实践 我国的人事测评经历了复苏阶段(1980-1988).初步应用阶段(1989-1992).繁荣发展阶段(1993-迄今). 20世纪90年代以来,随着政治体制改革的推进,国有企业改革的深化,尤其是国家公务员录用考试制 ...

  • 独活对AD模型大鼠定位航行行为学的影响_杜久钢
  • #144# 辽宁中医杂志2009年第36卷第1期 独活对AD 模型大鼠定位航行行为学的影响 杜久钢, 高嵩松, 王 辰, 杨雪山, 刘媛媛, 指导:王佰庆 (辽宁中医药大学, 辽宁沈阳110032) 摘 要:目的:观察独活改善老年性痴呆(AD ) 模型大鼠定位航行学习记忆功能的作用.方法:应用M o ...

  • 智能玩具机器人的工作原理
  • 智能玩具机器人的工作原理 人工智能(AI)可以说是最令人兴奋的在智能玩具机器人技术领域.这当然是最具争议的:每个人都同意,一个智能玩具机器人可以在装配线上工作,但是没有共识智能玩具机器人是否能够聪明. 像"智能玩具机器人"一词本身,人工智能是很难定义的.最终人工智能将是一个娱乐的 ...