数据结构程序设计课题.docx

上传人:b****5 文档编号:7511749 上传时间:2023-01-24 格式:DOCX 页数:9 大小:87.33KB
下载 相关 举报
数据结构程序设计课题.docx_第1页
第1页 / 共9页
数据结构程序设计课题.docx_第2页
第2页 / 共9页
数据结构程序设计课题.docx_第3页
第3页 / 共9页
数据结构程序设计课题.docx_第4页
第4页 / 共9页
数据结构程序设计课题.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构程序设计课题.docx

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

数据结构程序设计课题.docx

数据结构程序设计课题

衡阳师范学院

工科课程设计-《数据结构》

题目:

迷宫问题(栈)

学号:

姓名:

鲁向阳肖吟月

班级:

物联网班(1405)

指导教师:

王杰老师

日期:

2016年6月

1概述3

课程设计目的3

开发环境3

任务分配3

2需求分析4

题目内容4

设计思想说明4

数据结构设计5

3算法的设计6

定义坐标(X,Y):

6

定义方向:

6

定义/链表结点:

6

定义栈:

7

定义迷宫定义移动的4个方向:

7

4各模块的伪码算法8

根据输入产生一个8*8的迷宫:

8

探索路径函数:

11

输出迷宫14

5函数的调用关系图17

自动生成迷宫运行情况18

7心得体会19

参考文献20

附录20

1概述

1.1课程设计目的

本次课程设计是迷宫求解问题,主要是模拟从入口到出口的通路。

程序中的数据采取的是“栈”作为数据的逻辑结构,并且使用链式存储结构,即是实现一个以链表作存储结构的栈类型。

本课程设计实现了链栈的建立,入栈,出栈,判断栈是否为空的方法,关键的是迷宫通路路径的“穷举求解”和递归求解的方法。

1.2开发环境

具有Intel酷睿i3处理器且满足以下要求的计算机:

4GB内存,500GB硬盘;安装VisualC++。

1.3任务分配

两人一起查找相关资料,整合并进行探讨。

其中一人通过查找的资料先行拟定文件的大纲,初步定稿后,然后再由另一个人进行进一步加工,细化,最后两人一起核实文件,进行进一步的升华,最终完成该任务。

2需求分析

2.1题目内容

以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

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

2.2设计思想说明

计算机解迷宫通常用的是“穷举求解”方法,首先从迷宫的入口开始,如果该位置就是迷宫出口,则已经找到了一条路径,搜索工作结束。

否则从入口出发,顺着某个方向进行探索,若能走通,则继续往前进,否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

假如所有可能的通路都探索到而未能到达出口,则所设的迷宫没有通路。

可以用二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。

为处理方便起见,可在迷宫的四周加一圈障碍。

对于迷宫中任一位置均可约定有东、南、西、北四个方向可通。

要实现上述算法,需要用到栈的思想。

栈里面压的是走过的路径,若遇到死路,则将该位置在栈的顶层)弹出,再进行下一次判断;若遇到通路,则将该位置压栈并进行下一次判断。

如此反复循环,直到程序结束。

此时,若迷宫有通路,则栈中存储的是迷宫通路坐标的倒序排列,再把所有坐标顺序排列好后,即可得到正确的迷宫通路。

2.3数据结构设计

(1)以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

迷宫的四周有一圈障碍。

(2)程序输出的结果以三元组(i,j,di)的形式输出,其中:

(i,j)指示迷宫中的一个坐标,di表示走到下一坐标的方向,di的取值为0、1、2、3分别表示北、东、南、西。

(3)若设定的迷宫存在通路,则以方阵形式将迷宫及其通路输出到标准输出文件上,对于迷宫中的每个方块,有上下左右4个方块相邻,第i行第j列的当前方块的位置记为(i,j),规定上方方块为方位0,并按顺时针方向递增编号。

在试探过程中,假设按从方位0到方位3的顺序查找下一个可走的方块。

(4)先将入口进栈(其初始方位设置为-1),在栈不空时循环:

取栈顶方块(不退栈),若该方块是出口,则输出栈中所有方块即为路径,否则,找下一个可走的相邻方块,若不存在这样的方块,说明当前路径不可能走通,则回溯。

也就是恢复当前方块为0后退栈;若存在这样的方块,则将这个可走的相邻方块进栈(其初始方位设置为-1)。

3算法的设计

3.1定义坐标(X,Y)

#include

#include

usingnamespacestd;

structCoor

{

introw;

intcolumn;

intdirection;

};

3.2定义方向

structMove

{

introw;

intcolumn;

};

3.3定义/链表结点

structLinkNode

{

Coordata;

LinkNode*next;

};

3.4定义栈

classstack

{

private:

LinkNode*top;

public:

stack();

~stack();

voidPush(Coordata);

CoorPop();

CoorGetPop();

voidClear();

boolIsEmpty();

};

3.5定义迷宫定义移动的4个方向

Movemove[4]={{0,1},{1,0},{0,-1},{-1,0}};

6、几个函数功能的描述:

stack();ow==().row&&().column==().column))

(Temp2);

ow;olumn;ow==().row&&().column==().column)

ow-temp->;olumn-temp->;

ow==().row&&().column==().column))

(Temp2);

ow;olumn;ow==().row&&().column==().column)

ow-temp->;olumn-temp->;//列坐标方向

if(a==1)temp->=1;//方向向下,用1表示

elseif(b==1)temp->=2;//方向向右,用2表示

elseif(a==-1)temp->=3;//方向向上,用3表示

elseif(b==-1)temp->=4;//方向向左,用4表示

(temp->data);//把新位置入栈

deletetemp;

}

cout<<"坐标(row,column,direction)中x在指向当前位置所在的行数,y指向当前位置所在的列数,";

cout<<"direction表示下一位置走向。

"<

//输出路径,包括行坐标,列坐标,下一个位置方向

while(!

())//栈非空,继续输出

{

data=();

cout<<'('<<<<','<<<<','<<<<",";//输出行坐标,列坐标

switch//输出相应的方向

{

case1:

cout<<"↓)\n";break;

case2:

cout<<"→)\n";break;

case3:

cout<<"↑)\n";break;

case4:

cout<<"←)\n";break;

case0:

cout<<")\n";break;

}

}

}

voidPrintPath2(intm,intn,stackp,int**maze)//输出路径

{

cout<<"迷宫的路径为\n";

for(inti=0;i

{

for(intj=0;j

cout<

cout<

}

}

voidRestore(int**maze,intm,intn)//恢复迷宫

{

inti,j;

for(i=0;i

for(j=0;j

{

if(maze[i][j]==8)//恢复探索过位置,即把-1恢复为0

maze[i][j]=0;

}

}

精心搜集整理,只为你的需要

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

当前位置:首页 > 高中教育 > 语文

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

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