数据结构迷宫课程设计

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

华中科技大学文华学院数据结构课程设计

报告

学部:信息科学与技术学部

专业班级:09级通信工程2班

姓名:沈弋轩

学号: 0901********

指导教师:张采芳老师

时间:2011.11.18

实验一栈和队列的应用

一、实验目的

熟悉栈的定义和栈的基本操作. 熟悉队列的定义和栈的基本操作. 掌握递归和非递归算法的实现技术和实际应用. 加深对栈结构的理解,培养解决实际问题的编程能力。

二、实验内容

完成迷宫问题求解。

三、实验基本原理

所谓求迷宫问题,就是在一个指定的迷宫中求出从入口到出口的路径,在求解时,我们先从入口出发,顺某一方向向前试探,若能走通,则继续往前走,否则,沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止。

四、源程序及注释

#include

#define Maxsize 500

#define M 4

#define N 4

struct

{

int i,j,di; //当前方块行号、列号、下一可走相邻方位的方位号

}qu[Maxsize],path[Maxsize]; //定义栈、最小路径存放

int top=-1; //初始化栈顶指针

int mgpath(int xi,int yi,int xe,int ye,int mg[M+2][N+2]) //求解路径为(xi.yi)->(xe,ye)

{ //此处放置前面顺序栈的定义

int num=0;

int i,j,k,di,find,minlenth=Maxsize;

top++; //初始化栈qu[top].i=xi;

qu[top].j=yi; //取栈顶方块qu[top].di=-1; //找到了出口,输出路径

mg[1][1]=-1;

printf("迷宫路径如下:\n");

while(top>-1)//栈不为空时循环

{

i=qu[top].i;j=qu[top].j;

di=qu[top].di;

if(i==xe&&j==ye)

{num++;

printf("第%d条路径:\n",num);

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

{

path[k]=qu[k];

printf("\t(%d,%d)",qu[k].i,qu[k].j);

if((k+1)%5==0) //每输出5个方块后换一行

printf("\n");

}

printf("\n\n");

mg[qu[top].i][qu[top].j]=0;

if(top+1

{

minlenth=top+1;

for(int c=0;c<=top;c++)

path[k]=qu[k];

}

top--;

i=qu[top].i;j=qu[top].j;di=qu[top].di;

}

find=0;

while(di<=4&&find==0) //找(i,j)下一可走方块

{

di++; //找下一方位

switch(di)

{

case 0: i=qu[top].i-1; j=qu[top].j;break;

case 1: i=qu[top].i; j=qu[top].j+1;break;

case 2: i=qu[top].i+1; j=qu[top].j;break;

case 3: i=qu[top].i; j=qu[top].j-1;break;

}

if(mg[i][j]==0) find=1; //找到下一可走相邻方块

}

if(find==1) //找到一可走相邻方块

{

qu[top].di=di; //修改原栈顶元素di

top++; //将可走相邻方块进栈

qu[top].i=i;qu[top].j=j;qu[top].di=-1;

mg[i][j]=-1; //值制为-1,避免重复走到该方块}

else //没有相邻方块可走,退出栈

{

mg[qu[top].i][qu[top].j]=0; //该位置变为其他路径可走方向

top--; //该方块退栈

}

}

printf("路径条数:%d\n",num);

printf("\n最短路径长度为:%d\n",minlenth);

printf("\n最短路径为:\n");

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

{

printf("\t(%d,%d)",path[k].i,path[k].j);

if((k+1)%5==0)

printf("\n");

}

printf("\n");

return(0); //没有可走路径,返回0

}

void main()

{

int i,j;

int mg[M+2][N+2]={

{1,1,1,1,1,1},

{1,0,0,0,1,1},

{1,0,1,0,0,1},

{1,0,0,0,1,1},

相关文档
最新文档