迷宫问题说明书Word下载.docx

上传人:b****6 文档编号:19387347 上传时间:2023-01-05 格式:DOCX 页数:31 大小:232.74KB
下载 相关 举报
迷宫问题说明书Word下载.docx_第1页
第1页 / 共31页
迷宫问题说明书Word下载.docx_第2页
第2页 / 共31页
迷宫问题说明书Word下载.docx_第3页
第3页 / 共31页
迷宫问题说明书Word下载.docx_第4页
第4页 / 共31页
迷宫问题说明书Word下载.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

迷宫问题说明书Word下载.docx

《迷宫问题说明书Word下载.docx》由会员分享,可在线阅读,更多相关《迷宫问题说明书Word下载.docx(31页珍藏版)》请在冰豆网上搜索。

迷宫问题说明书Word下载.docx

typedefstruct{

intord;

//通道块在路径上的“序号”

PosTypeseat;

//通道块在迷宫中的“坐标位置”

intdi;

//从此通道块走向下一通道块的“方向”

//栈的元素类型

StatusMazePath(MazeTypemaze,PosTypestart,PosTypeend){

//若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶),并返回TURE;

否则返回FALSE

Initstack(s);

curpos=start;

//设定“当前位置”为“入口位置”

curtep=1;

//探索第一步

do{

if(Pass(curpos)){//当前位置可以通过,即是未曾走到过的通道块

Footprint(curpos);

//留下足迹

e=(curstep,curpos,1);

Push(S,e);

//加入路径

If(curpos==end)

return(TRUE);

//到达终点(出口)

curpos=NextPos(curpos,1);

//下一位置是当前位置的东邻

curstep++;

//探索下一步

}//if

else{//当前位置不能通过

if(!

StackEmpty(s)){

Pop(S,e);

While(e.di==4&

&

!

StackEmpty(S)){

MarkPrint(e.seat);

//留下不能通过的标记,并退回一步

}//while

if(e.di<

4){

e.di++;

//换下一个方向探索

curpos=NextPos(e.seate.di);

//设定当前位置是该新方向上的相邻块

}//if

}//else

}while(!

StackEmpty(S));

return(FALSE);

}//MazePath

3.函数的调用关系图

4.调试分析

a.迷宫行列数非法时,有提示但无法返回重新输入;

用二元组表示通路路径时,出口没显示。

b、算法的时间复杂度和空间复杂度:

空间复杂度:

O

(1).

时间复杂度:

随机生成迷宫:

O(n*n);

探寻出口:

O(n*n);

输出迷宫:

判断当前位置可通:

5.测试结果

1.进入欢迎界面:

2.选择手动生成:

3.选择自动生成:

4.生成结果:

5.无通路输出:

6.有通路及路径输出:

6.源程序(带注释)

#include<

stdio.h>

malloc.h>

stdlib.h>

#defineSTACK_INIT_SIZE100

#defineSTACKINCREMENT10

#definem100

#definen100

typedefintMazeType[m+2][n+2];

MazeTypeMaze;

intcurstep=1;

//顺序栈

voidshoudong_Maze(inta,intb)

inti,j;

printf("

\n\n"

);

请按行输入迷宫,0表示通路,1表示障碍:

for(j=0;

j<

b+2;

j++)//定义周边值为1(同墙)

{

Maze[0][j]=1;

//迷宫上面行的周边即上边墙

Maze[a+1][j]=1;

//迷宫下面行的周边即下边墙

}

for(i=1;

i<

a+1;

i++)

Maze[i][0]=1;

//迷宫左边列的周边即左边墙

Maze[i][b+1]=1;

//迷宫右边列的周边即右边墙

请输入迷宫内墙单元数:

\n"

=a;

for(j=1;

=b;

j++)

scanf("

%d"

&

Maze[i][j]);

}

voidzidong_Maze(intc,intd)

d+2;

Maze[c+1][j]=1;

c+1;

Maze[i][d+1]=1;

\n迷宫生成中……\n\n"

system("

pause"

=c;

=d;

Maze[i][j]=rand()%2;

voiddisplayMaze(intf,intk)

\n迷宫生成结果如下:

for(i=0;

f+2;

for(j=0;

k+2;

j++)

printf("

Maze[i][j]);

printf("

用方格显示迷宫矩阵如下:

{

if(Maze[i][j]==0)printf("

□"

if(Maze[i][j]==1)printf("

■"

}

boolInitStack(SqStack*S)

(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!

(*S).base)

exit(0);

(*S).top=(*S).base;

(*S).stacksize=STACK_INIT_SIZE;

returntrue;

boolStackEmpty(SqStackS)

if(S.top==S.base)

returntrue;

else

returnfalse;

boolPush(SqStack*S,SElemTypee)

if((*S).top-(*S).base>

=(*S).stacksize)

(*S).base=(SElemType*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));

if(!

exit(0);

(*S).top=(*S).base+(*S).stacksize;

(*S).stacksize+=STACKINCREMENT;

*((*S).top)++=e;

boolPop(SqStack*S,SElemType*e)

if((*S).top==(*S).base)

*e=*--(*S).top;

boolPass(PosTypecurpos)

if(Maze[curpos.x][curpos.y]==0)

voidFootPrint(PosTypecurpos)

Maze[curpos.x][curpos.y]=curstep;

PosTypeNextPos(PosTypecurpos,intdi)

PosTypefangxiang[4]={{0,1},{1,0},{0,-1},{-1,0}};

//(右下左上即东南西北)各方向的变量

curpos.x+=fangxiang[di].x;

curpos.y+=fangxiang[di].y;

returncurpos;

voidMarkPrint(PosTypecurpos)

Maze[curpos.x][curpos.y]=-1;

//将下一位置不通的当前位置标记为-1

intMazePath(PosTypestart,PosTypeend)

{

SqStackS;

PosTypecurpos;

SElemTypee;

InitStack(&

S);

curpos=start;

do

if(Pass(curpos))

//当前位置可以通过,即是未曾走到过的通道块

FootPrint(curpos);

//留下足迹

e.ord=curstep;

e.seat.x=curpos.x;

e.seat.y=curpos.y;

e.di=0;

Push(&

S,e);

//入栈当前位置及状态

curstep++;

//足迹加1

if(curpos.x==end.x&

curpos.y==end.y)//到达终点(出口)

return1;

curpos=NextPos(curpos,e.di);

迷宫路径用二元组表示如下:

(%d,%d)\n"

e.seat.x,e.seat.y);

else

//当前位置不能通过

if(!

StackEmpty(S))

{

Pop(&

S,&

e);

//退栈到前一位置

curstep--;

//前一位置处于最后一个方向(北)

while(e.di==3&

{

MarkPrint(e.seat);

//留下不能通过的标记(-1)

Pop(&

//退回一步

curstep--;

}

if(e.di<

3)//没到最后一个方向(北)

e.di++;

//换下一个方向探索

Push(&

curstep++;

//设定当前位置是该新方向上的相邻块

curpos=NextPos(e.seat,e.di);

}

}while(!

return0;

voidprintPath(intg,inth)//显示能求解的迷宫求解后的迷宫结构

用curstep步骤显示求解迷宫路径如下:

g+2;

h+2;

迷宫通路(用☆表示)如下所示:

if(Maze[i][j]==0||Maze[i][j]==-1)printf("

if(Maze[i][j]>

1)printf("

☆"

voidmenu()

charchoice;

intt,z;

PosTypestart,end;

**************************************************************\n"

*迷宫问题求解*\n"

*可选操作*\n"

*1.手动生成迷宫(请键入1)*\n"

*2.自动生成迷宫(请键入2)*\n"

*3.退出迷宫求解程序(请键入3)*\n"

请选择(1,2,3):

"

scanf("

choice);

switch(choice)

case1:

请输入迷宫的行数(不含外墙):

t);

请输入迷宫的列数(不含外墙):

z);

if((0<

t&

t<

=80)&

(0<

z&

z<

=80))

输入数据合法,程序继续......\n"

输入行列数据超出迷宫最大范围(或者输入数据不合法),请重新输入行列数:

shoudong_Maze(t,z);

displayMaze(t,z);

请输入迷宫入口(用坐标表示即x空格y):

scanf("

%d%d"

start.x,&

start.y);

请输入迷宫出口(用坐标表示即x空格y):

end.x,&

end.y);

if(MazePath(start,end))

printPath(t,z);

else

printf("

此迷宫没有从入口到出口的通路!

menu();

break;

case2:

zidong_Maze(t,z);

case3:

谢谢使用!

break;

default:

选择选项输入错误!

请重新输入:

menu();

break;

voidmain()

{menu();

总结

在这两周的数据结构课程设计中,我的题目是:

迷宫问题,这两周课程设计中,通过该题目的设计过程,我加深了对栈的逻辑结构,存储结构及入栈出栈过程的理解,对栈的基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。

一个人要完成所有的工作是非常困难和耗时的。

在以后的学习中我会更加注意各个方面的能力的协调发展。

在课程设计时遇到了很多的问题,在老师的帮助,和对各种资料的查阅中,将问题解决,培养了我自主动手,独立研究的能力,为今后在学习中能更好的发展打下了坚实的基础。

二周的课程设计很短暂,但其间的内容是很充实的,在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各课知识融会,组织,来配合学习。

参考文献

1严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社.

2严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.

3《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版).

4谭浩强.《c语言程序设计》.清华大学出版社.

5.数据结构与算法分析(Java版),APracticalIntroductiontoDataStructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer,张铭,刘晓丹译电子工业出版社2001年1月

致谢

在课程设计的过程中,我得到了老师和同学们的热情帮助。

没有他们的帮助,我就无法顺利完成自己的课设任务。

在此,首先要感谢我的指导老师——张永老师。

我的同学在程序调试的初期给了我很大帮助,没有他们的帮助,我很难发现一些潜在的错误,在此对他们表示一并的感谢。

附件Ⅰ任务一源程序代码

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

当前位置:首页 > 人文社科 > 教育学心理学

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

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