数据结构程序设计课题文档格式.docx
《数据结构程序设计课题文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构程序设计课题文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
![数据结构程序设计课题文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/11/010c4a3e-b71b-4c1f-af1b-c1243af75f64/010c4a3e-b71b-4c1f-af1b-c1243af75f641.gif)
(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<
iostream>
fstream>
usingnamespacestd;
structCoor
{
introw;
intcolumn;
intdirection;
};
3.2定义方向
structMove
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、几个函数功能的描述:
//构造函数,置空栈
//析构函数
//把元素data压入栈中
//使栈顶元素出栈
//取出栈顶元素
//把栈清空
//判断栈是否为空
boolMazepath(int**maze,intm,intn);
//寻找迷宫maze中从(0,0)到(m,n)的路径
//到则返回true,否则返回false
voidPrintPath(stackp);
//输出迷宫的路径
voidPrintPath2(intm,intn,stackp,int**maze);
//输出路径
voidRestore(int**maze,intm,intn);
//恢复迷
4各模块的伪码算法
4.1根据输入产生一个8*8的迷宫
m=a;
n=b;
maze=newint*[m+2];
//申请长度等于行数加2的二级指针
for(i=0;
i<
m+2;
i++)//申请每个二维指针的空间
{
maze[i]=newint[n+2];
}
for(i=1;
=m;
i++)
for(j=1;
j<
=n;
j++)
cin>
>
maze[i][j];
cout<
<
"
是否保存新迷宫?
\n"
;
用Y或y表示保存、N或n表示不保存\n"
charchoose;
choose;
if(choose=='
Y'
||choose=='
y'
)
charch;
ofstreamfop("
Newtest.txt"
);
for(i=1;
i++)
{
for(j=1;
{
ch='
0'
+maze[i][j];
fop<
ch;
}
fop<
endl;
flush(cout);
}
fop.close();
}
//给迷宫的四周加一堵墙,即把迷宫四周定义为1
for(i=0;
maze[i][0]=maze[i][n+1]=1;
n+2;
maze[0][i]=maze[m+1][i]=1;
for(intp=0;
p<
++p)
for(intq=0;
q<
=n+2;
++q)
if(maze[p][q]==0)
cout<
■"
if(maze[p][q]>
=1)
□"
cout<
returnmaze;
//返回存贮迷宫的二维指针maze
4.2探索路径函数
boolMazepath(int**maze,intm,intn)
stackq,p;
//定义栈p、q,分别存探索迷宫的存储和路径过程
CoorTemp1,Temp2;
introw,column,loop;
Temp1.row=1;
Temp1.column=1;
q.Push(Temp1);
//将入口位置入栈
p.Push(Temp1);
maze[1][1]=8;
//标志入口位置已到达过
while(!
q.IsEmpty())//栈q非空,则反复探索
Temp2=q.GetPop();
//获取栈顶元素
if(!
(p.GetPop().row==q.GetPop().row&
&
p.GetPop().column==q.GetPop().column))
p.Push(Temp2);
//如果有新位置入栈,则把上一个探索的位置存入栈p
for(loop=0;
loop<
4;
loop++)//探索当前位置的4个相邻位置
row=Temp2.row+move[loop].row;
//计算出新位置x位置值
column=Temp2.column+move[loop].column;
//计算出新位置y位置值
if(maze[row][column]==0)//判断新位置是否可达
Temp1.row=row;
Temp1.column=column;
maze[row][column]=8;
//标志新位置已到达过
q.Push(Temp1);
//新位置入栈
if((row==(m))&
(column==(n)))//成功到达出口
Temp1.row=m;
Temp1.column=n;
Temp1.direction=0;
p.Push(Temp1);
//把最后一个位置入栈
charchoose;
cout<
请选择以坐标形式(row,column,direction)输出迷宫选
(1)或以方阵形式输出迷宫选
(2):
cin>
if(choose=='
1'
)
{
PrintPath(p);
//坐标显示输出
Restore(maze,m,n);
}
else
PrintPath2(m,n,p,maze);
//矩阵显示输出
return1;
//表示成功找到路径
if(p.GetPop().row==q.GetPop().row&
p.GetPop().column==q.GetPop().column)
//如果没有新位置入栈,则返回到上一个位置
p.Pop();
q.Pop();
return0;
//表示查找失败,即迷宫无路经
}
4.3输出迷宫
voidPrintPath(stackp)//输出路径
迷宫的路径为\n"
括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向)\n"
stackt;
//定义一个栈,按从入口到出口存取路径
inta,b;
LinkNode*temp;
temp=newLinkNode;
//申请空间
temp->
data=p.Pop();
//取栈p的顶点元素,即第一个位置
t.Push(temp->
data);
//第一个位置入栈t
deletetemp;
//释放空间
p.IsEmpty())//栈p非空,则反复转移
temp=newLinkNode;
temp->
//获取下一个位置
//得到行走方向
a=t.GetPop().row-temp->
data.row;
//行坐标方向
b=t.GetPop().column-temp->
data.column;
//列坐标方向
if(a==1)temp->
data.direction=1;
//方向向下,用1表示
elseif(b==1)temp->
data.direction=2;
//方向向右,用2表示
elseif(a==-1)temp->
data.direction=3;
//方向向上,用3表示
elseif(b==-1)temp->
data.direction=4;
//方向向左,用4表示
t.Push(temp->
//把新位置入栈
deletetemp;
坐标(row,column,direction)中x在指向当前位置所在的行数,y指向当前位置所在的列数,"
direction表示下一位置走向。
//输出路径,包括行坐标,列坐标,下一个位置方向
t.IsEmpty())//栈非空,继续输出
data=t.Pop();
'
('
data.row<
'
data.column<
data.direction<
"
//输出行坐标,列坐标
switch(data.direction)//输出相应的方向
case1:
cout<
↓)\n"
break;
case2:
→)\n"
case3:
↑)\n"
case4:
←)\n"
case0:
)\n"
voidPrintPath2(intm,intn,stackp,int**maze)//输出路径
for(inti=0;
i<
m+2;
++i)
for(intj=0;
j<
n+2;
++j)
cout<
maze[i][j]<
"
cout<
endl;
5函数的调用关系图
6测试结果
6.1自动生成迷宫运行情况
(1)选择生成迷宫输入1如下图所示
(2)选择以坐标形式输出迷宫:
7心得体会
通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C语言的使用都有了更深的了解。
尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。
在设计此程序时,刚开始感到比较迷茫,然后一步步分析,试着写出基本的算法,思路渐渐清晰,最后完成程序。
当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获。
在遇到描写迷宫路径的算法时,我感到有些困难,后来经过一步步分析和借鉴书本上的穷举求解的算法,最后把算法写出来。
在利用递归方法求路径时花费了我很长时间,由于本人对递归方面的知识运用较少,导致我不熟悉它的用法,但最终还是通过询问同学、查找书本和上网了解关于递归方面的知识写出来了。
这次课程设计让我更加深入了解很多方面的知识,如链结构的栈类型及其基本操作,数组的运用等等。
在程序的编写中不要一味的模仿,要自己去摸索,只有带着问题反复实践,才能熟练地掌握和运用。
在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。
参考文献
[1]严蔚敏、吴伟民:
《数据结构(C语言版)》[M],清华大学出版社2007年版
[2]谭浩强:
《C语言设计(第三版)》[M],清华大学出版社2005年版
[3]曹衍龙、林瑞仲、徐慧:
《C语言实例解析精粹(第二版)》[M],人民邮电出版社
附录
structCoor//定义描当前位置的结构类型
structMove//定义下一个位置的方向
structLinkNode//链表结点
//定义栈
stack:
:
stack()//构造函数,置空栈
top=NULL;
~stack()//析构函数
voidstack:
Push(Coorx)//把元素data压入栈中
LinkNode*TempNode;
TempNode=newLinkNode;
TempNode->
data=x;
next=top;
top=TempNode;
Coorstack:
Pop()//使栈顶元素出栈
CoorTemp;
TempNode=top;
top=top->
next;
Temp=TempNode->
data;
deleteTempNode;
returnTemp;
GetPop()//取出栈顶元素
returntop->
Clear()//把栈清空
boolstack:
IsEmpty()
if(top==NULL)
returntrue;
else
returnfalse;
//定义移动的4个方向
//恢复迷宫
int**GetMaze(int&
m,int&
n);
//获取迷宫(可从文件中读取,也可输入)
//返回存取迷宫的二维指针
intmain()
system("
colorf5"
intm=0,n=0;
int**maze;
//定义二维指针存取迷宫
cout<
\n\t\t****************欢迎使用迷宫模拟程序*************"
<
\t\t14级计算机物联网班"
\t\t鲁向阳肖吟月"
\t\t学号:
1445013914450132"
maze=GetMaze(m,n);
//调用GetMaze(int&
n)函数,得到迷宫
if(Mazepath(maze,m,n))//调用Mazepath(int**maze,intm,intn)函数获取路径
迷宫路径探索成功!
elsecout<
路径不存在!
n)
inti=0,j=0;
charChoose;
//定义一个标志,选择读取文件或直接输入,获取迷宫
请选择生成
(1)或键盘输入
(2):
Choose;
if(Choose=='
)//当标志Choose为‘1’时,读取文件
生成迷宫如下:
//定义一个字符,读取文件中的内容
i=0,j=0;
//首先得到文件中数字字符的数目,并得到迷宫的长和宽
ifstreamfip("
test.txt"
//定义一个文件对象,并打开文件“test.txt”
while(fip.get(ch))//从读取文件中内容(一个个字符)
if(ch>
='
ch<
9'
)//获取文件中的数字字符
j++;
//如果是字符,列就加1
if(ch=='
\n'
i++;
//如果是换行,就行加1
n=j;
//得到宽,即列数
j=0;
fip.close();
//读取文件结束
m=i;
//得到长即行数
maze[i]=newint[n+2];
i=j=1;
ifstreamfip2("
//重新读取文件,以得到内容
while(fip2.get(ch))
if(ch>
maze[i][j]=ch-'
//把数字字符转化为数字,并存到指针里
maze[i][j]<
//在屏幕中显示迷宫
j++;
if(ch=='
)//遇到换行,指针也相应换行
i++;
j=1;
fip2.close();
//读取结束
else//Choose=2,输入迷宫
请输入迷宫的行数和列数:
(中间用空格键分开)"
a>
b;
请输入迷宫内容:
(0表示通路,1表示不连通。
中间用空格键分开)\n"
m=a;
maze=new