迷宫问题实验报告用栈解决迷宫问题Word格式.docx

上传人:b****3 文档编号:16910720 上传时间:2022-11-27 格式:DOCX 页数:17 大小:32.35KB
下载 相关 举报
迷宫问题实验报告用栈解决迷宫问题Word格式.docx_第1页
第1页 / 共17页
迷宫问题实验报告用栈解决迷宫问题Word格式.docx_第2页
第2页 / 共17页
迷宫问题实验报告用栈解决迷宫问题Word格式.docx_第3页
第3页 / 共17页
迷宫问题实验报告用栈解决迷宫问题Word格式.docx_第4页
第4页 / 共17页
迷宫问题实验报告用栈解决迷宫问题Word格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

迷宫问题实验报告用栈解决迷宫问题Word格式.docx

《迷宫问题实验报告用栈解决迷宫问题Word格式.docx》由会员分享,可在线阅读,更多相关《迷宫问题实验报告用栈解决迷宫问题Word格式.docx(17页珍藏版)》请在冰豆网上搜索。

迷宫问题实验报告用栈解决迷宫问题Word格式.docx

则{

删去栈顶位置;

若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空。

}while(栈不空)

三.详细设计

栈的设计:

typedefstruct

{

Node*base,*top;

intlength;

}Stack;

Stack*initstack();

//初始化栈

voidprintstack(Stack*s);

//打印栈

Statusdestroy(Stack*);

//销毁整个栈

Statusdeltop(Stack*s);

//出栈

Statuspushelem(Stack*,ElemType,ElemType);

//进栈

1.主程序模块:

intmain()

printf("

12的迷宫,X字符表示障碍,空符表示通路:

\n"

);

Mazea[N][N];

makemaze(a);

输入回车键显示路径,*字符表示路径。

getchar();

findpath(a);

while

(1);

return0;

2.迷宫生产模块;

voidmakemaze(Maze(*p)[N])

inti,j,conter;

for(i=0;

i<

N;

++i)

for(j=0;

j<

++j)

{

(*(p+i)+j)->

pos=0;

freq=0;

move[0]=0;

move[1]=0;

move[2]=0;

move[3]=0;

}

(*p+j)->

pos='

X'

;

(*(p+N-1)+j)->

for(i=1;

N-1;

(*(p+i))->

(*(p+i)+N-1)->

srand((int)time(NULL));

for(conter=0;

conter<

20;

++conter)

i=rand()%(N-2);

j=rand()%(N-2);

if(i==1&

&

j==1||i==N-1&

j==N-1)

printmaze(p);

3.路径查找模块。

Maze*testnewpos(Maze(*p)[N],Stack*s,int*i,int*j)

Maze*q=NULL;

intselect=0;

*i=*j=0;

for(;

q==NULL&

select<

4;

++select)//在可行的方向上只选一个

switch(select)

case0:

if((*(p+s->

top->

x)+s->

y)->

move[0]!

=1)

(*(p+s->

move[0]=1;

q=*(p+s->

y+1;

*i=s->

x+0;

*j=s->

}//退回前一步检查东方向是否可通

break;

case1:

move[1]!

move[1]=1;

x+1)+s->

y;

*i=s->

x+1;

y+0;

}//退回前一步检查南方向是否可通

case2:

move[2]!

move[2]=1;

y-1;

}//退回前一步检查西方向是否可通

case3:

move[3]!

move[3]=1;

x-1)+s->

x-1;

}//退回前一步检查北方向是否可通

returnq;

voidprintpath(Stack*s,Maze(*p)[N])

Node*n;

inti,j,conter;

conter=0;

n=s->

base;

n;

n=n->

next)

(*(p+n->

x)+n->

*'

for(i=0;

for(j=0;

++conter;

printf(FORMAT,(*(p+i)+j)->

pos);

if(conter%12==0)TURNLINE;

TURNLINE;

完整的程序:

maze.h

#ifndefMAZE_H

#defineMAZE_H

#include"

mazepath.h"

#include<

time.h>

#defineN12//10+2

#defineFORMAT"

%2c"

#defineTURNLINEprintf("

typedefstruct

charpos;

intfreq;

intmove[4];

}Maze;

voidmakemaze(Maze(*p)[N]);

voidprintmaze(Maze(*p)[N]);

voidfindpath(Maze(*p)[N]);

Maze*testnewpos(Maze(*p)[N],Stack*,int*,int*);

voidprintpath(Stack*s,Maze(*p)[N]);

voidmakemaze(Maze(*p)[N])

voidprintmaze(Maze(*p)[N])

voidfindpath(Maze(*p)[N])

Maze*q=NULL;

inti=1,j=1,*pi=&

i,*pj=&

j,success=0;

Stack*s;

s=initstack();

//初始化用来存储路径的栈

q=*(p+1)+1;

//初始化当前位置为入口位置

do

if(q->

pos!

='

!

(q->

freq))//当前位置通且在当前路径中未被访问过,则入栈

if(i==N-2&

j==N-2)

pushelem(s,N-2,N-2);

success=1;

elseif(i==1&

j==1)

pushelem(s,i,j);

q->

freq=1;

//当前位置已经进栈,作标记,不能再入栈,不然就只能兜死胡同了

//切换下一位置为东邻位置,并做标记,东邻位置已经使用

i=s->

j=s->

q=*(p+i)+j;

else

else//当前位置不通,则在前一步(栈顶)检查是否有其他方向可行

//printf("

stephere..."

if(s->

base!

=s->

top)

do//查找新的通路直到新通路出现或者回到初始位置

{

q=testnewpos(p,s,&

i,&

j);

//返回其它三个方向的其中一个和新的当前位置的坐标

if(q==NULL)deltop(s);

//栈顶没有可继续往下走的通路,删除栈顶,在新的栈顶找

}while(q==NULL&

s->

top);

}while(success!

=1);

printpath(s,p);

*j=s->

#endif

mazepath.h

#ifndefMAZEPATH_H

#defineMAZEPATH_H

#include<

stdio.h>

stdlib.h>

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASIBLE-1

#defineOVERFLOW-2

typedefintElemType;

typedefintStatus;

typedefstructnode

ElemTypex;

ElemTypey;

structnode*next;

structnode*prior;

}Node,*Postion;

Stack*initstack()

Stack*s;

s=(Stack*)malloc(sizeof(Stack));

if(!

s)returnERROR;

base=s->

top=NULL;

//栈空

length=0;

returns;

voidprintstack(Stack*s)

Node*N;

N=s->

N=N->

%2d%2d"

N->

x,N->

y);

printf("

\n\n"

Statusdestroy(Stack*s)

Node*p;

p=s->

while(s->

base->

s->

next;

//N=N->

next和free(P)不能倒换位置,当释放p时,

free(p);

//如果不将N移向下一个位置,将导致N指向的内存释放,N->

next不再有效

p=s->

returnOK;

Statusdeltop(Stack*s)

length)

Underflow\n"

//已经是空栈

else

top;

top=p->

prior;

--s->

length;

next=NULL;

}

Statuspushelem(Stack*s,ElemTypei,ElemTypej)

Node*n;

n=(Node*)malloc(sizeof(Node));

n)returnERROR;

n->

x=i;

y=j;

if(s->

length==0)

top=n;

n->

prior=NULL;

prior=s->

next=n;

++s->

MyMain.cpp

maze.h"

intmain()

四.调试结果及说明

1.说明:

本程序的运行环境为VC++6.0,执行文件为MgProblem.exe。

2.测试结果

实际程序执行过程如下图所示:

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

当前位置:首页 > 解决方案 > 营销活动策划

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

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