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

上传人:b****5 文档编号:6514319 上传时间:2023-01-07 格式:DOCX 页数:13 大小:193.02KB
下载 相关 举报
数据结构迷宫问题课程设计.docx_第1页
第1页 / 共13页
数据结构迷宫问题课程设计.docx_第2页
第2页 / 共13页
数据结构迷宫问题课程设计.docx_第3页
第3页 / 共13页
数据结构迷宫问题课程设计.docx_第4页
第4页 / 共13页
数据结构迷宫问题课程设计.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

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

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

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

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

 

数据结构迷宫问题课程设计(总12页)

数据结构课程设计报告

 

设计题目:

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

班级:

计科152

学号:

姓名:

徐昌港

 

南京农业大学计算机系

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

一.课程设计题目

迷宫问题

以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

要求:

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

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

其中:

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

二.算法设计思想

1.需求分析

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

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

2.概要设计

(1)主程序模块:

voidmain()

{

intmaze[row][col];

structmarkstart,end;细设计

(1)坐标位置类型

structmark{

inta,b;户使用说明

(1)本程序的运行环境为debug运行环境,执行文件为:

.cpp;

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

点击

运行程序

(3)出现以下窗口后

输入迷宫的行列数,回车;再继续输入迷宫的数据,1表示障碍,0表示通路;再输入入口坐标和出口坐标,回车。

就可以显示出迷宫路径。

2.测试结果

(1)输入行列数:

5,5

输入迷宫数据为:

00011

11011

00010

01100

00000

出口位置:

1,1

出口位置:

5,5

(2)输入行列数:

4,9

输入迷宫数据为:

000000100

010001000

001110011

001110100

输入入口坐标:

1,1

输入出口坐标:

4,9

(3)输入行列数:

9,8

输入迷宫数据为:

00100010

00100010

00001101

01110010

00010000

01000101

01111001

11000101

11000000

输入入口坐标:

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

#definerow100

#definecol100

structmark{

inta,b;

};

structelement{

inti,j,d;//坐标与方向

};

typedefstructLinkstack{

elementelem;

structLinkstack*next;

}*SLinkstack;

intinitstack(SLinkstack&L)

{

L=NULL;

return1;

}

intstack_empty(SLinkstackL)

{

if(L==NULL)

return1;

else

return0;

}

intpush_stack(SLinkstack&L,elementE)

{

SLinkstackP;

P=(SLinkstack)malloc(sizeof(Linkstack));

P->elem=E;

P->next=L;

L=P;

return1;

}

intpop(SLinkstack&L,element&E)

{

SLinkstackP;

if(!

stack_empty(L))

{

E=L->elem;

P=L;

L=L->next;

free(P);

return1;

}

else

return0;

}

voidbuilt_maze(intmaze[row][col])//建立迷宫

{

intx,y;

intm,n;

printf("请输入迷宫的行列数(用逗号隔开):

");

scanf("%d,%d",&m,&n);

printf("请输入迷宫各行各列的数据(用空格隔开):

\n");

for(x=0;x

{

for(y=0;y

{

if(x==0||x==m+1||y==0||y==n+1)//迷宫周围加墙壁

maze[x][y]=1;

else

scanf("%d",&maze[x][y]);

}

}

printf("迷宫生成中……\n");

printf("迷宫显示为:

\n");

for(x=0;x

{

for(y=0;y

printf("%3d",maze[x][y]);

printf("\n");

}

}

 

voidmaze_path(intmaze[row][col],intdir[4][2],structmarkstart,structmarkend)

{

inti,j,d;

intx,y;

elementelem,E;

SLinkstackL1,L2;

initstack(L1);

initstack(L2);

maze[][]=2;//标记起点坐标

=;

=;

=-1;//d=-1表示无方向

push_stack(L1,elem);

while(!

stack_empty(L1))

{

pop(L1,elem);

i=;

j=;

d=+1;//下一个方向

while(d<4)//探索东西南北各个方向

{

x=i+dir[d][0];

y=j+dir[d][1];

if(x==&&y==&&maze[x][y]==0)

{//这里表示已经到了出口

=i;

=j;

=d;

push_stack(L1,elem);

=x;

=y;

=-1;

push_stack(L1,elem);

while(L1)//逆置序列,输出迷宫路径

{

pop(L1,E);

push_stack(L2,E);

}

while(L2)

{

pop(L2,E);

printf("(%d,%d,%d)\n",,,;

}

return;

}

if(maze[x][y]==0)

{

maze[x][y]=2;//标记走过这个点

=i;

=j;

=d;

push_stack(L1,elem);

i=x;

j=y;

d=-1;

}

d++;

}

}

printf("此迷宫无出路");

}

voidmain()

{

intmaze[row][col];

structmarkstart,end;//出入口的坐标

intdir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//方向,依次是东西南北

printf("***********************************************************************************************\n");

printf("\t***************欢迎使用迷宫模拟程序***************\n");

printf("***********************************************************************************************\n");

built_maze(maze);

printf("请输入入口的横纵坐标:

");

scanf("%d,%d",&,&;

printf("请输入出口的横纵坐标:

");

scanf("%d,%d",&,&;

printf("0为东,1为南,2为西,3为北,-1为出路\n");

maze_path(maze,dir,start,end);

printf("按任意键继续");

getchar();

}

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

当前位置:首页 > 医药卫生

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

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