数据结构c语言课程设计报告Word文件下载.docx
- 文档编号:15951805
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:17
- 大小:117.22KB
数据结构c语言课程设计报告Word文件下载.docx
《数据结构c语言课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构c语言课程设计报告Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
使用非递归算法。
2.用户可以根据自己的需求进行输入所需的迷宫,其中1表示迷宫的墙壁,0表示迷宫的通路,从而建立自己的迷宫;
3.用户还可以自己设计迷宫的入口坐标,当然也可以设计出口了;
4.程序执行的命令包括:
(1)构造栈Stack,T描述迷宫中当前位置的结构类型,LinkNode链表结点三个类,其中Stack是Linknode的友元类.
(2)构造存取迷宫的二维指针GetMaze(int&
m,int&
n)
(3)恢复迷宫Restore(int**maze,intm,intn)(
4)在迷宫中寻找一条通路Mazepath(int**maze,intm,intn)
(5)输出所找到的通路PrintPath()
(6)定义当前位置移动的4个方向move数组.
三.总体设计
㈠存储结构:
首先用二维指针存储迷宫数据,迷宫数据由用户输入。
一个以链表作存储结构的栈类型,然后编写一个求解迷宫的递归或非递归程序。
求得的通路以三元组(i,j,d)形式输出,其中:
(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向(东、南、西、北四个方向所用代表数字,自行定义)。
1.从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;
否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。
假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。
迷宫的入口点的下标为(1,1),出口点的下标为(m,n)。
为处理方便起见,可在迷宫的四周加一圈障碍。
对于迷宫的任一位置,均可约定有东、南、西、北四个方向可通。
经过的位置把0变为-1,带输出迷宫路径后在恢复迷宫院士为止
2.本程序有三个模块:
⑴主程序模块
⑵三个类模块即其对象:
实现栈链表抽象数据类型;
⑶迷宫二维指针单元模块:
存储迷宫,,寻路径,输出迷宫,恢复迷宫。
(二)流程图
四.详细设计
(一).基本算法:
迷宫的过程可以模拟为一个搜索的过程:
每到一处,总让它按东、南、西、北4个方向顺序试探下一个位置;
如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;
如果4方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。
每前进或后退一步,都要进行判断:
若前进到了出口处,则说明找到了一条通路;
若退回到了入口处,则说明不存在通路。
用一个二维指针数组迷宫表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。
迷宫的入口点在位置(1,1)处,出口点在位置(m,n)处。
设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。
二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的外墙;
第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;
其余元素值用GetMaze函数获取.
假设当前所在位置是(x,y)。
沿某个方向前进一步,它可能到达的位置最多有4。
如果用二维数组move记录4方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定:
x=x+move[loop][0]
y=y+move[loop][1]
从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。
定义一个栈,按从入口到出口存取路径.
在搜索过程中,每前进一步,如果有新位置入栈,则把上一个探索的位置存入栈中,当前位置”-1”(表示这个位置在通路上),并将该位置的坐标压入栈中。
如果没有新位置入栈,则返回到上一个位置.
到达出口后,最后一个位置入栈,输出路径,并回复路径.把-1变为0.
总之,入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;
(二).为实现算法,需要类的象数据类型:
类及其对象:
类Stack对象成员如下:
Stack();
构造函数,置空栈操作结果:
构造一个空的栈S。
析构函数
voidPush(Te);
把元素data压入栈中
TPop();
使栈顶元素出栈
TGetPop();
取出栈顶元素
voidClear();
把栈清空
boolempty();
判断栈是否为空,如果为空则返回1,否则返回0
T类迷宫中当前位置的结构类型:
T对象成员如下:
x;
x代表当前位置的行坐标
y;
y代表当前位置的列坐标
dir;
0:
无效,1:
东,2:
南,3:
西,4:
北
LinkNode类链表结点:
对象成员如下:
友元类Stack
Tdata
LinkNode*next
(三).函数调用关系
main
GetMazeMazepath
Empy()GetPop()Push()PrintPath()Restore()
Pop()GetPop()Push()
(四)算法的时间、空间复杂度
1)本算法在空间上主要开辟了一个二维指针,规模都是迷宫(m+2)*(n+2),一个是栈,一个是迷宫路径记录,输出时候调用栈,在恢复迷宫。
2)在时间上为简单的链表栈的存储结构,二维指针GetMaze,Restore两函数算法时间复杂度为O((m+2)*(n+2)),Mazepath,PrintPath为O
(1),(m为行数,n为列数)。
(五)UML图
五.代码
/*以一个m×
n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出,其中:
(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
如:
对于下列数据的迷宫,输出的一条通路为:
(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。
*/
#include<
iostream>
usingnamespacestd;
classT//定义描述迷宫中当前位置的结构类型
{
public:
intx;
//x代表当前位置的行坐标
inty;
//y代表当前位置的列坐标
intdir;
//0:
};
classLinkNode//链表结点
friendclassStack;
Tdata;
LinkNode*next;
classStack
private:
LinkNode*top;
//指向第一个结点的栈顶指针
Stack();
//构造函数,置空栈
~Stack();
//析构函数
voidPush(Te);
//把元素data压入栈中
TPop();
//使栈顶元素出栈
//取出栈顶元素
//把栈清空
//判断栈是否为空,如果为空则返回1,否则返回0
Stack:
:
Stack()//构造函数,置空栈
top=NULL;
}
~Stack()//析构函数
voidStack:
Push(Te)//把元素x压入栈中
LinkNode*P;
P=newLinkNode;
P->
data=e;
next=top;
top=P;
TStack:
Pop()//使栈顶元素出栈
TTemp;
P=top;
top=top->
next;
Temp=P->
data;
deleteP;
returnTemp;
GetPop()//取出栈顶元素
returntop->
Clear()//把栈清空
boolStack:
empty()//判断栈是否为空,如果为空则返回1,否则返回0
if(top==NULL)return1;
elsereturn0;
intmove[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
//定义当前位置移动的4个方向
boolMazepath(int**maze,intm,intn);
//寻找迷宫maze中从(0,0)到(m,n)的路径
//到则返回true,否则返回false
voidPrintPath(Stackp);
//输出迷宫的路径
voidRestore(int**maze,intm,intn);
//恢复迷宫
int**GetMaze(int&
n);
//获取迷宫
//返回存取迷宫的二维指针
intmain()
intm=0,n=0;
//定义迷宫的长和宽
int**maze;
//定义二维指针存取迷宫
maze=GetMaze(m,n);
//调用GetMaze(int&
n)函数,得到迷宫
if(Mazepath(maze,m,n))//调用Mazepath(int**maze,intm,intn)函数获取路径
cout<
<
"
迷宫路径探索成功!
\n"
;
elsecout<
路径不存在!
return0;
n)//返回存取迷宫的二维指针
inti=0,j=0;
请输入迷宫的长和宽:
inta,b;
cin>
>
a>
b;
//输入迷宫的长和宽
请输入迷宫内容:
m=a;
n=b;
//m,n分别代表迷宫的行数和列数
maze=newint*[m+2];
//申请长度等于行数加2的二级指针
for(i=0;
i<
m+2;
i++)//申请每个二维指针的空间
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言 课程设计 报告