数据结构课程设计C++.docx

上传人:b****7 文档编号:26163831 上传时间:2023-06-17 格式:DOCX 页数:26 大小:411.58KB
下载 相关 举报
数据结构课程设计C++.docx_第1页
第1页 / 共26页
数据结构课程设计C++.docx_第2页
第2页 / 共26页
数据结构课程设计C++.docx_第3页
第3页 / 共26页
数据结构课程设计C++.docx_第4页
第4页 / 共26页
数据结构课程设计C++.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

数据结构课程设计C++.docx

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

数据结构课程设计C++.docx

数据结构课程设计C++

数据结构课程设计

 

题目:

迷宫问题的求解

姓名:

安冬辉

学号:

20090802310067

班级:

09理科实验班

学院:

信息科学技术学院

指导老师:

任一凡

目录

一、【问题介绍(Instruction)】3

二、【实验构思(Conceive)】3

三、【实验设计(Design)】4

1、设定迷宫的抽象数据类型定义4

2、本程序的三个模块5

3、迷宫类型5

4、栈类型5

5、主函数5

6、迷宫构造6

7、迷宫的显示转换7

8、求解迷宫中的一条路径8

9、迷宫的输出显示11

10.迷宫的路径显示11

四、【测试结果(Testing)】12

1迷宫存在通路12

2迷宫不存在通路15

五、【实验总结(Summarize)】17

六、【代码】18

一、【问题介绍(Instruction)】

迷宫问题最早出现在古希腊神话中。

据说,半人半兽的英雄西修斯在克里特的迷宫中勇敢地杀死半人半牛的怪物,并循着绳索逃出迷宫。

希腊史学家希罗多德曾探访过那里。

他描述说,整个迷宫由12座带顶院落构成,所有的院落都由通道连接,形成3000个独立的“室”。

后来的参观者也说,一旦进入迷宫,如果没有向导,根本无望走出。

历史上,人们认为迷宫具有魔力。

后来,迷宫成为游戏。

在如今计算机非常普及的情况下,迷宫又以游戏程序的形式呈现在我们日常使用的电脑上。

二、【实验构思(Conceive)】

(本部分包括:

描述实验实现的基本思路,包括所用到的离散数学、程序设计、算法等相关知识)

1、迷宫求解问题,完成时的功能:

能在规定的矩阵迷宫中从开始点走到规定的终点;以一个mxn的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。

2、以二维数组maze[M][N]表示迷宫,其中maze[0][j]和maze[i][0](0<=j,i<=N)为添加的一圈障碍。

数组中以元素“1”表示通路,“0”表示障碍,迷宫的大小理论上可以不限制。

3、迷宫数据由程序提供,用户只需要进行选择迷宫就行。

迷宫的入口和出口由程序提供。

4、若设定的迷宫存在通路,则以长方形矩阵的形式将迷宫及其通路输出到标准终端上,其中“1”表示障碍,“0”表示通路,“.”表示通过的路径,“+”表示死胡同。

5、本程序只求出一条成功的通路。

但是只要对函数进行小量的修改,就可以求出其他全部的路径。

6、程序执行命令为:

创建迷宫→求解迷宫→输出迷宫。

三、【实验设计(Design)】

(本部分包括:

抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)

1、设定迷宫的抽象数据类型定义

ADTmigong{

数据对象:

D={ai,j|i,j,0<=i<=M,0<=j<=N}

数据关系:

R={hang,lie}

hang={|ai-1,j,ai,j属于D,i=1,2,…M,j=0,1,…N}

lie={|ai,j-1,ai,j属于D,i=0,1,…M,j=1,2,…N}

基本操作:

gouzhaomigong(&maze,hang,lie)

初始条件:

为二维数组maze[i][j]分配空间,对其中第1至第i-1行,每行自第1到第j-1列的元素进行赋值,并以值0表示障碍,值1表示通路。

操作结果:

构造迷宫的字符数组,以"0"表示通路,字符‘1’表示障碍,并自动在迷宫四周加上一圈障碍。

qiujiemigong(&maze,hang,lie)

初始条件:

迷宫中的所有坐标都已经被赋值

操作结果:

若迷宫中该坐标能够通过且已经通过,则标记为".",若不能够通过(死胡同),标记为"+"。

xianshimigong(maze,hang,lie)

初始条件:

迷宫已经存在

操作结果:

以字符形式输出迷宫

xianshimigonglujing(maze,hang,lie)

初始条件:

迷宫已经存在,已经求解

操作结果:

若迷宫通路存在,以字符形式输出迷宫的求解路径,否则输出“次迷宫没有出路”。

danbuxianshi(maze,hang,lie)

初始条件:

迷宫已存在

操作结果:

显示迷宫求解过程的每一步结果

}ADTmigong

2、本程序的三个模块

2.1主程序模块

intmain()

{

初始化;

构造迷宫;

迷宫求解;

迷宫输出;

}

2.2栈模块——记录迷宫路径

2.3迷宫模块——实现迷宫的抽象数据类型

3、迷宫类型

typedefstructmigong

{elemtypemaze[i][j];//迷宫矩阵的坐标值

inthang,lie;//迷宫矩阵的行数、列数

}migong;

4、栈类型

structstep//定义一个栈

{

intx,y,n;//x,y表示步子坐标,n表示步数

};

5、主函数

intmain()

{

变量的定义;

gouzhaomigong(&maze,hang,lie);//构造一个迷宫

xianshimigong(migong,hang,lie);//将该构造好的迷宫输出

qiujiemigong(&maze,hang,lie);//探索迷宫

xianshimigonglujing(maze,hang,lie);//输出探索出来的迷宫

danbuxianshi(maze,hang,lie);//单步显示迷宫的路径

}

6、迷宫构造

voidgouzhaomigong(char**maze[i][j],inthang,intlie)

{

char**maze;//定义一个迷宫,空间可动态

inthang,lie,i,j;

cout<<"请输入矩阵的行列"<

cout<<"行数:

";

cin>>hang;

cout<<"列数:

";

cin>>lie;

cout<

maze=newchar*[hang+2];//分配连续空间给迷宫

for(i=0;i

maze[i]=newchar[lie+2];

cout<<"请输入迷宫,0表示通路,1表示墙"<

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

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

cin>>maze[i][j];

for(i=0;i

maze[i][0]='1';

for(i=0;i

maze[0][i]='1';

for(i=0;i

maze[hang+1][i]='1';

for(i=0;i

maze[i][lie+1]='1';

cout<

7、迷宫的显示转换

voidchange(char**maze,inthang,intlie)//改变以下迷宫的样子,为了单步显示清楚

{

for(inti=0;i

{

for(intj=0;j

switch(maze[i][j])

{

case'1':

maze[i][j]='#';break;

case'+':

case'0':

case'.':

maze[i][j]='';break;

}

}

}

8、求解迷宫中的一条路径

voidqiujiemigong(char**maze,inthang,intlie)

{

inti=1,j=1,n=-1;

charQ;

step*Step;//定义一个存储路程的栈

Step=newstep[hang*lie];//事先给其分配一定的空间,[hang*lie]表示空间足够

if(maze[1][1]=='1')

{

cout<<"迷宫入口堵住了,无法行走!

!

!

"<

getch();

exit(0);

}

else

{

n++;

maze[i][j]='.';

Step[n].x=i;

Step[n].y=j;

while(maze[hang][lie]!

='.')//由右、下、左、上的顺序判断是否走通

{

//'1'表示走不通,'+'表示已经走过但不通又回来的步子,'.'表示已经走过并通了的步子

if(maze[i][j+1]!

='1'&&maze[i][j+1]!

='.'&&maze[i][j+1]!

='+')

{

maze[i][j+1]='.';

j=j+1;

n++;

Step[n].x=i;

Step[n].y=j;

cout<<"第"<

"<<"向右走到:

"<<"("<

}

elseif(maze[i+1][j]!

='1'&&maze[i+1][j]!

='.'&&maze[i+1][j]!

='+')

{

maze[i+1][j]='.';

i=i+1;

n++;

Step[n].x=i;

Step[n].y=j;

cout<<"第"<

"<<"向下走到:

"<<"("<

}

elseif(maze[i][j-1]!

='1'&&maze[i][j-1]!

='.'&&maze[i][j-1]!

='+')

{

maze[i][j-1]='.';

j=j-1;

n++;

Step[n].x=i;

Step[n].y=j;

cout<<"第"<

"<<"向左走到:

"<<"("<

}

elseif(maze[i-1][j]!

='1'&&maze[i-1][j]!

='.'&&maze[i-1][j]!

='+')

{

maze[i-1][j]='.';

i=i-1;

n++;

Step[n].x=i;

Step[n].y=j;

cout<<"第"<

"<<"向上走到:

"<<"("<

}

else//若走不通则返回上一步

{

if(i==1&&j==1)//当回到入口时,说明无通路,结束循环

break;

else

{

maze[i][j]='+';//将走不通的点置为+

n--;

i=Step[n].x;//返回上一个点

j=Step[n].y;

cout<<"此路不通!

返回至上一步:

"<<"("<

}

}

if(i==hang&&j==lie)

cout<<"成功走到出口!

!

!

"<<""<<"共"<

}

}

9、迷宫的输出显示

voidxianshimigong(maze[i][j],inthang,intlie)

{

cout<<"************您输入的迷宫为****************"<

cout<<"行数:

"<

"<

cout<<""<<"入口:

"<<"1,1"<<""<<"出口:

"<

for(i=0;i

{

for(j=0;j

cout<

cout<

}

}

 

10.迷宫的路径显示

voidxianshimigonglujing(char**maze,inthang,intlie,inti,intj)//输出所走的路程

{

if((i==1&&j==1)&&(hang!

=1&&lie!

=1))//若回到原点则表明无出路

{

cout<

cout<<"************************************************************"<

cout<<"|-------------此迷宫没有出路,所走路线如下图---------------|"<

cout<<"************************************************************"<

}

else//否则有出路

{

cout<

cout<<"************************************************************"<

cout<<"|----------------找到迷宫出路,如图所示--------------------|"<

cout<<"************************************************************"<

}

for(i=0;i

{

for(j=0;j

cout<

cout<

}

}

 

四、【测试结果(Testing)】

(本部分包括:

对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析总结)

1迷宫存在通路

2迷宫不存在通路

 

五、【实验总结(Summarize)】

(本部分应包括:

自己在实验中完成的任务;对所完成实验的经验总结、心得)

在这次数据结构课程设计中,我的题目是:

迷宫问题,通过该题目的设计过程,我加深了对栈的逻辑结构,存储结构及入栈出栈过程的理解,对栈的基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。

一个人要完成所有的工作是非常困难和耗时的。

在以后的学习中我会更加注意各个方面的能力的协调发展。

在课程设计时遇到了很多的问题,在同学的帮助下,各种资料的查阅中,解决问题,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。

 

六、【代码】

(本部分包括:

完整的代码及充分的注释)

#include

#include

#include

usingnamespacestd;

structstep//定义一个栈

{

intx,y,n;//x,y表示步子坐标,n表示步数

};

voidchange(char**maze,inthang,intlie)//改变以下迷宫的样子,就为了好看点

{

for(inti=0;i

{

for(intj=0;j

switch(maze[i][j])

{

case'1':

maze[i][j]='#';break;

case'+':

case'0':

case'.':

maze[i][j]='';break;

}

}

}

voidstep_to_step(char**maze,step*Step,inthang,intlie,intn)

{//单步输出

for(intk=0;k<=n;k++)

{

for(inti=0;i

{

for(intj=0;j

{

if(Step[k].x==i&&Step[k].y==j)

cout<<"."<<"";

elsecout<

}

cout<

}

cout<<"这是第"<

getch();

}

}

voidout(char**maze,inthang,intlie,inti,intj)//输出所走的路程

{

if((i==1&&j==1)&&(hang!

=1&&lie!

=1))//若回到原点则表明无出路

{

cout<

cout<<"************************************************************"<

cout<<"|-------------此迷宫没有出路,所走路线如下图---------------|"<

cout<<"************************************************************"<

}

else//否则有出路

{

cout<

cout<<"************************************************************"<

cout<<"|----------------找到迷宫出路,如图所示--------------------|"<

cout<<"************************************************************"<

}

for(i=0;i

{

for(j=0;j

cout<

cout<

}

}

voidcure(char**maze,inthang,intlie)

{

inti=1,j=1,n=-1;

charQ;

step*Step;//定义一个存储路程的栈

Step=newstep[hang*lie];//事先给其分配一定的空间,[hang*lie]表示空间足够

if(maze[1][1]=='1')

{

cout<<"迷宫入口堵住了,无法行走!

!

!

"<

getch();

exit(0);

}

else

{

n++;

maze[i][j]='.';

Step[n].x=i;

Step[n].y=j;

while(maze[hang][lie]!

='.')//由右、下、左、上的顺序判断是否走通

{

//'1'表示走不通,'+'表示已经走过但不通又回来的步子,'.'表示已经走过并通了的步子

if(maze[i][j+1]!

='1'&&maze[i][j+1]!

='.'&&maze[i][j+1]!

='+')

{

maze[i][j+1]='.';

j=j+1;

n++;

Step[n].x=i;

Step[n].y=j;

cout<<"第"<

"<<"向右走到:

"<<"("<

}

elseif(maze[i+1][j]!

='1'&&maze[i+1][j]!

='.'&&maze[i+1][j]!

='+')

{

maze[i+1][j]='.';

i=i+1;

n++;

Step[n].x=i;

Step[n].y=j;

cout<<"第"<

"<<"向下走到:

"<<"("<

}

elseif(maze[i][j-1]!

='1'&&maze[i][j-1]!

='.'&&maze[i][j-1]!

='+')

{

maze[i][j-1]='.';

j=j-1;

n++;

Step[n].x=i;

Step[n].y=j;

cout<<"第"<

"<<"向左走到:

"<<"("<

}

elseif(maze[i-1][j]!

='1'&&maze[i-1][j]!

='.'&&maze[i-1][j]!

='+')

{

maze[i-1][j]='.';

i=i-1;

n++;

Step[n].x=i;

Step[n].y=j;

cout<<"第"<

"<<"向上走到:

"<<"("<

}

else//若走不通则返回上一步

{

if(i==1&&j==1)//当回到入口时,说明无通路,结束循环

break;

else

{

maze[i][j]='+';//将走不通的点置为+

n--;

i=Step[n].x;//返回上一个点

j=Step[n].y;

cout<<"此路不通!

返回至上一步:

"<<"("<

}

}

if(i==hang&&j==lie)

cout<<"成功走到出口!

!

!

"<<""<<"共"<

}

}

out(maze,hang,lie,i,j);

cout<

cout<<"是否察看详细路线(y/n):

";//只有成功走出迷宫时才能察看路线

cin>>Q;

cout<

if(Q=='y')

{

change(maze,hang,lie);

step_to_step(maze,Step,hang,lie,n);

}

}

intmain()

{

char**maze;//定义一个迷宫,空间可动态

inthang,lie,i,j;

cout<<"请输入矩阵的行列"<

cout<<"行数:

";

cin>>hang;

cout<<"列数:

";

cin>>lie;

cout<

maze=newchar*[hang+2];//分配连续空间给迷宫

for(i=0;i

maze[i]=newchar[lie+2];

cout<<"请输入迷宫,0表示通路,1表示墙"<

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

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

cin>>maze[i][j];

for(i=0;i

maze[i][0]='1';

f

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

当前位置:首页 > 农林牧渔 > 林学

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

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