数据结构迷宫问题求解Word下载.docx
《数据结构迷宫问题求解Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构迷宫问题求解Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
2.输入输出的要求:
(i)求得的通路以三元组(i,j,d)的形式输出,其中:
(i,j)指示迷宫中的一个坐标,d表示走到下一个坐标的方向。
(ii)输出迷宫示意图
3.程序所能达到的功能:
(i)实现一个以链表作存储结构的栈类型,以非递归算法求出通路
(ii)以一个递归算法,对任意输入的迷宫矩阵求出所有通路。
2概要设计
1.①构建一个二维数组maze[M][N]用于存储迷宫矩阵
②手动生成迷宫,即为二维数组maze[M][N]赋值
③构建一个栈用于存储迷宫路径
④建立迷宫节点用于存储迷宫中每个节点的访问情况;
非递归
本程序包含6个函数:
(1)主函数main()
(2)生成迷宫create_maze()
(4)打印迷宫print_maze()
(5)搜索迷宫路径并用三元组输出路径mgpath()
(6)用图来输出路径print_tu();
递归
本程序包含3个函数:
(1)主函数main();
(2)打印迷宫printmaze();
(3)搜索迷宫路径pass(intx,inty);
3.详细设计
1.非递归
起点和终点的结构类型typedefstruct{
inth;
intl;
}T;
栈节点类型typedefstructcell{
introw;
intcol;
intdir;
}TCell;
1.生成迷宫
voidcreat_maze(inta,intb)
{定义i,j为循环变量
for(i<
a)
for(j<
b)
输入maze[i][j]的值
}
2.打印迷宫
voidprint_maze(intm,intn)
{
用i,j循环变量,将maze[i][j]输出
3.搜索迷宫路径
voidmazepath(intmaze[][],Ts,Te)//参数传递迷宫和起点与终点
{
TCellS[N1*N2];
top=0;
//建立栈
S[top].row=s.h;
S[top].col=s.l;
S[top].dir=-1;
//起点入栈
while(top>
=0)//判栈是否空
{i,j为当前访问点的位置
if(i,j是终点坐标)
用循环输出栈里的元素;
else将(i,j),即访问点入栈,然后向四周寻找是否有通路,若有通路,将原访问点标记(赋值-1),选一条通路作为新访问点,入栈。
若没有通路,回溯,将栈顶元素出栈作为访问点,继续寻找通路。
4.生成路线图
Print_tu()
i,j为循环变量
for(i<
a)
b)
if(maze[i][j]==1);
print(“#”)//#表示墙
elseif(maze[i][j]==0)
print(“”)
elseprint(“+”)//+表示路径
2.递归
voidprintmaze()
voidpass(intx,inty)
将访问点标记maze[x][y]=-1;
if(x,y是终点坐标)
调用printmaze()输出栈里的元素;
if(x,y的左边是通路)
递归调用pass(x,y-1);
if(x,y的右边是通路)
递归调用pass(x,y+1);
if(x,y的上边是通路)
递归调用pass(x-1,y);
if(x,y的下边是通路)
递归调用pass(x+1,y);
4.测试与分析
【小结或讨论】
这次的项目,加强了我动手、思考和解决问题的能力。
巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力培养了我查阅参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
附页源程序
#include<
stdio.h>
stdlib.h>
#defineN110
#defineN210
intmaze[N1][N2];
//迷宫数组
typedefstruct{//起点终点坐标
typedefstructcell{
intdir;
//栈的元素结构
TCellS[N1*N2];
//栈
voidcreat_maze(inta,intb)//建立迷宫
inti,j;
for(i=0;
i<
a;
i++)
for(j=0;
j<
b;
j++)
scanf("
%d"
&
maze[i][j]);
voidprint_maze(inta,intb)//打印迷宫
{
for(j=0;
printf("
%d"
maze[i][j]);
\n"
);
}
voidprint_tu(inta,intb)//打印迷宫路径图
{
if(maze[i][j]==1)
printf("
#"
elseif(maze[i][j]==0)
"
else
+"
}
voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径
inttop=0;
inti,j,k,find,di;
maze[s.h][s.l]=-1;
while(top>
=0)
i=S[top].row;
j=S[top].col;
di=S[top].dir;
if(i==e.h&
&
j==e.l)
输出迷宫路径三元组:
for(k=0;
k<
=top;
k++)
%d%d%d\n"
S[k].row,S[k].col,S[k].dir);
return;
find=0;
while(find==0&
di<
4)
di++;
switch(di)
{
case0:
{i=S[top].row-1;
j=S[top].col;
break;
}
case1:
{i=S[top].row;
j=S[top].col+1;
case2:
{i=S[top].row+1;
case3:
j=S[top].col-1;
}
if(maze[i][j]==0)find=1;
if(find==1)
S[top].dir=di;
top++;
S[top].row=i;
S[top].col=j;
maze[i][j]=-1;
else
maze[S[top].row][S[top].col]=0;
top--;
printf("
没有路径\n"
intmain()//主函数
inta,b;
Ts,e;
输入迷宫的行数与列数:
%d,%d"
a,&
b);
输入迷宫数据:
creat_maze(a,b);
输出迷宫:
print_maze(a,b);
输入起点与终点:
s.h,&
s.l);
e.h,&
e.l);
mazepath(maze,s,e);
输出迷宫图和路线:
print_tu(a,b);
intmaze[9][9]={
1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,1,
1,0,1,1,0,1,1,0,1,
1,0,1,0,0,1,0,0,1,
1,0,1,0,1,0,1,0,1,
1,0,0,0,0,0,1,0,1,
1,1,0,1,1,0,1,1,1,
1,1,1,1,1,1,1,1,1
};
9;
elseif(maze[i][j]==-1)
elseprintf("
maze[x][y]=-1;
if(x==7&
y==7)
输出路径\n"
printmaze();
if(maze[x][y+1]==0)
pass(x,y+1);
if(maze[x+1][y]==0)
pass(x+1,y);
if(maze[x-1][y]==0)
pass(x-1,y);
if(maze[x][y-1]==0)
pass(x,y-1);
maze[x][y]=0;
intmain()
intinx=1,iny=1;
迷宫图是:
pass(inx,iny);