数据结构迷宫问题求解.docx

上传人:b****5 文档编号:4342568 上传时间:2022-11-30 格式:DOCX 页数:12 大小:64.67KB
下载 相关 举报
数据结构迷宫问题求解.docx_第1页
第1页 / 共12页
数据结构迷宫问题求解.docx_第2页
第2页 / 共12页
数据结构迷宫问题求解.docx_第3页
第3页 / 共12页
数据结构迷宫问题求解.docx_第4页
第4页 / 共12页
数据结构迷宫问题求解.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构迷宫问题求解.docx

《数据结构迷宫问题求解.docx》由会员分享,可在线阅读,更多相关《数据结构迷宫问题求解.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构迷宫问题求解.docx

数据结构迷宫问题求解

学号专业计算机科学与技术姓名

实验日期2017.6.20教师签字成绩

实验报告

【实验名称】迷宫问题的求解

【实验目的】

(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。

(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。

(3)用递归和非递归两种方式完成迷宫问题的求解。

【实验原理】

迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

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

栈是一个后进先出的结构,可以用来保存从入口到当前位置的路径。

【实验内容】

1需求分析

1.基本要求:

(1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出。

其中:

(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。

如,对于教材第50页图3.4所示的迷宫,输出一条通路为:

(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…

(2)编写递归形式的算法,求得迷宫中所有可能的通路。

(3)以方阵形式输出迷宫及其通路。

(4)按照题意要求独立进行设计,设计结束后按要求写出设计报告。

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

for(j

输入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

for(j

{

if(maze[i][j]==1);

print(“#”)//#表示墙

elseif(maze[i][j]==0)

print(“”)

elseprint(“+”)//+表示路径

}

2.递归

voidprintmaze()

{

用i,j循环变量,将maze[i][j]输出

}

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

#include

#defineN110

#defineN210

intmaze[N1][N2];//迷宫数组

typedefstruct{//起点终点坐标

inth;

intl;

}T;

typedefstructcell{

introw;

intcol;

intdir;

}TCell;//栈的元素结构

TCellS[N1*N2];//栈

voidcreat_maze(inta,intb)//建立迷宫

{

inti,j;

for(i=0;i

for(j=0;j

scanf("%d",&maze[i][j]);

}

voidprint_maze(inta,intb)//打印迷宫

{

inti,j;

for(i=0;i

{

for(j=0;j

printf("%d",maze[i][j]);

printf("\n");

}

}

voidprint_tu(inta,intb)//打印迷宫路径图

{

inti,j;

for(i=0;i

{

for(j=0;j

{

if(maze[i][j]==1)

printf("#");

elseif(maze[i][j]==0)

printf("");

else

printf("+");

}

printf("\n");

}

}

voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径

{

inttop=0;

inti,j,k,find,di;

S[top].row=s.h;

S[top].col=s.l;

S[top].dir=-1;

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)

{

printf("输出迷宫路径三元组:

\n");

for(k=0;k<=top;k++)

printf("%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;

break;

}

case2:

{i=S[top].row+1;j=S[top].col;

break;

}

case3:

{i=S[top].row;j=S[top].col-1;

break;

}

}

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;

printf("输入迷宫的行数与列数:

\n");

scanf("%d,%d",&a,&b);

printf("输入迷宫数据:

\n");

creat_maze(a,b);

printf("输出迷宫:

\n");

print_maze(a,b);

printf("输入起点与终点:

\n");

scanf("%d,%d",&s.h,&s.l);

scanf("%d,%d",&e.h,&e.l);

mazepath(maze,s,e);

printf("输出迷宫图和路线:

\n");

print_tu(a,b);

}

递归

#include

#include

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,0,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,1

};

voidprintmaze()

{

inti,j;

for(i=0;i<9;i++)

{

for(j=0;j<9;j++)

{

if(maze[i][j]==1)

printf("#");

elseif(maze[i][j]==-1)

printf("+");

elseprintf("");

}

printf("\n");

}

}

voidpass(intx,inty)

{

maze[x][y]=-1;

if(x==7&&y==7)

{

printf("输出路径\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;

printf("迷宫图是:

\n");

printmaze();

pass(inx,iny);

}

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

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

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

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