数据结构迷宫问题课程设计

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计报告设计题目:迷宫问题数据结构课程设计_

班级:计科152

学号:

姓名:徐昌港

南京农业大学计算机系

数据结构课程设计报告内容

一.课程设计题目

迷宫问题

以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。要求:首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。

二.算法设计思想

1.需求分析

(1)迷宫数据用一个二维数组int maze[row][col]来存储,在定义了迷宫的行列数后,用两个for循环来录入迷宫数据,并在迷宫周围加墙壁。

(2)迷宫的入口位置和出口位置可以由用户自己决定。

2.概要设计

(1)主程序模块:

void main()

{

int maze[row][col];

struct mark start,end; 细设计(1)坐标位置类型

struct mark{

户使用说明int a,b;

(1)本程序的运行环境

为debug运行环境,执行文件为:.cpp;

(2)用VC++运行文件后出现以下窗口:

点击运行程序

(3)出现以下窗口后

输入迷宫的行列数,回车;再继续输入迷宫的数据,1表示障碍,0

表示通路;再输入入口坐标和出口坐标,回车。就可以显示出迷宫路径。

main()

定义方向二维数组

初始化链栈,并将入口,出口

信息入栈

此坐标周围有无障碍

栈是否为空

当前坐标周围是否有

方向可以探索

此坐标信息入栈

此坐标是否为出口

栈逆置并输出路线

结束

坐标移动

换个方向搜索删除栈中

此步信息

迷宫无出路

主程序

built_maze

initstack push_stack pop stack_empty 是

2.测试结果

(1)输入行列数:5,5

输入迷宫数据为:0 0 0 1 1

1 1 0 1 1

0 0 0 1 0

0 1 1 0 0

0 0 0 0 0

出口位置:1,1

出口位置:5,5

(2)输入行列数:4,9

输入迷宫数据为:0 0 0 0 0 0 1 0 0

0 1 0 0 0 1 0 0 0

0 0 1 1 1 0 0 1 1

0 0 1 1 1 0 1 0 0

输入入口坐标:1,1

输入出口坐标:4,9

(3)输入行列数:9,8

输入迷宫数据为:0 0 1 0 0 0 1 0

0 0 1 0 0 0 1 0

0 0 0 0 1 1 0 1

0 1 1 1 0 0 1 0

0 0 0 1 0 0 0 0

0 1 0 0 0 1 0 1

0 1 1 1 1 0 0 1

1 1 0 0 0 1 0 1

1 1 0 0 0 0 0 0输入入口坐标:1,1

输入出口坐标:9,8

3.调试分析

(1)在刚开始写完代码后,运行发现程序只能运行简单的一条直线的迷宫,在运行复杂的迷宫时,不会碰到死路(周围没有可探索的道路)就删除坐标往回到前坐标换方向探索。最后我和同寝室同学一起探讨才发现程序中探索过的坐标没有标记,后来我将maze[x][y]=2将它作为标记才解决问题。

(2)程序中主要的两个算法:initmaze和maze_path的时间复杂度为O(m*n),空间复杂度也为O(m*n)。

五.总结(收获与体会)

通过这段时间的课程设计,我对数据结构和C语言的理解更加深刻了。在实践过程中我遇到了不少问题,但通过阅读相关书籍、求问老师同学,最终也解决了不少问题。这些问题也给了我相当多的收获。但通过这段时间的学习和解决的这么多问题,我觉得我对这些知识的掌握比以前好了许多。

求解迷宫问题用的是“穷举求解”的方法。从入口出发,沿着某一方向探索(这里我选择优先探索的是东面),若无障碍,继续往前走,否则眼原路返回,换个方向继续探索,直到将所有可能的通道都探索完为止。所以需要用栈来保存从入口到当前位置的路径。但因为之前在学习栈这一节的时候没学扎实,现在有很多知识都忘了。所以在编写求解迷宫路径的算法的时候我觉得有些困难,后来经过一步步分析和借鉴书上的穷举法才把算法写出来。但我还是除了许多错误,其中大部分是语法错误,这些最后都还是一一解决了。而且除了加深了栈的学习,我还复习了以前大一学的C语言中的二维数组和for,while循环。

这次课程设计不仅是让我们加深了解数据结构的理论知识,更重要的是培养我们解决实际问题的能力,能在不断地遇到问题,不断地解决问题的过程中培养自己的专业思维。所以我相信通过这次课程设计我们能够提升自己的分析、设计程序和编写程序的能力。

六.源程序

#include<>

#include<>

#define row 100

#define col 100

struct mark{

int a,b;

};

struct element{

int i,j,d; //坐标与方向};

typedef struct Linkstack{

element elem;

struct Linkstack *next;

}*SLinkstack;

int initstack(SLinkstack &L) {

L=NULL;

return 1;

}

int stack_empty(SLinkstack L) {

if(L==NULL)

return 1;

相关文档
最新文档