可连通迷宫程序Word文件下载.docx

上传人:b****3 文档编号:16805260 上传时间:2022-11-26 格式:DOCX 页数:13 大小:19.19KB
下载 相关 举报
可连通迷宫程序Word文件下载.docx_第1页
第1页 / 共13页
可连通迷宫程序Word文件下载.docx_第2页
第2页 / 共13页
可连通迷宫程序Word文件下载.docx_第3页
第3页 / 共13页
可连通迷宫程序Word文件下载.docx_第4页
第4页 / 共13页
可连通迷宫程序Word文件下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

可连通迷宫程序Word文件下载.docx

《可连通迷宫程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《可连通迷宫程序Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。

可连通迷宫程序Word文件下载.docx

r)<

=M/2&

M>

8)InitStartEnd(start,end,degree);

//当难度为2、3、4时,为了增加难度,如果产生的起点和终点在同一行,则重新产生。

}

voidCreateWell(charMaze[M][N],PosTypestart,PosTypeend,intdegree)

{

inti,j;

Maze[start.r][start.c]='

s'

;

//设置起点

Maze[end.r][end.c]='

e'

//设置终点

start.c++;

end.c--;

queue<

PosType>

Q;

Q.push(start);

Maze[start.r][start.c]='

'

boolflag[4];

PosTypetemp,temp1,father[M][N];

boolmap[M][N];

memset(map,true,sizeof(map));

while(!

Q.empty()){

temp=Q.front();

Q.pop();

if(temp.c==end.c&

temp.r==end.r)break;

intt=0;

memset(flag,true,sizeof(flag));

while(t!

=4){

i=rand()%4;

if(!

flag[i])continue;

t++;

flag[i]=false;

temp1=temp;

temp1.r+=dir[i][0];

temp1.c+=dir[i][1];

if(temp1.r<

=0||temp1.r>

=M-1||temp1.c<

=0||temp1.c>

=N-1)continue;

if(map[temp1.r][temp1.c]==false)continue;

map[temp1.r][temp1.c]=false;

Q.push(temp1);

father[temp1.r][temp1.c].c=temp.c;

father[temp1.r][temp1.c].r=temp.r;

}

}

intx,y;

//打通通路

while(temp.c!

=start.c||temp.r!

=start.r){

Maze[temp.r][temp.c]='

x=temp.r;

y=temp.c;

temp.r=father[x][y].r;

temp.c=father[x][y].c;

/////根据难度设置不同的通路与墙的比例//////

intu=1;

switch(degree){

case1:

u=N*M/1;

break;

case2:

u=N*M/2;

case3:

u=N*M/4;

case4:

u=N*M/7;

default:

printf("

输入错误,进入默认难度1"

);

break;

intt;

while(u!

=0){

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

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

if(Maze[i][j]!

='

Maze[i][j]='

//随机产生迷宫空格

u--;

voidInitMaze(charMaze[M][N],PosTypestart,PosTypeend,intdegree){

inti,j;

for(i=0;

i<

M;

i++){

for(j=0;

j<

N;

j++)

#'

}//初始化迷宫矩阵全部为墙

CreateWell(Maze,start,end,degree);

//对迷宫内部的可行路径的设置

PosTypeNextPos(PosTypetest,intdi){//求下一个探索的目标,方向先(→)后(↑)

PosTypeReturnPos;

switch(di){

case1:

//向东寻(→)

ReturnPos.r=test.r;

ReturnPos.c=test.c+1;

break;

case2:

//向北寻(↑)

ReturnPos.r=test.r-1;

ReturnPos.c=test.c;

case3:

//向南寻(↓)

ReturnPos.r=test.r+1;

case4:

//向西寻(←)

ReturnPos.c=test.c-1;

ReturnPos.di=1;

ReturnPos.ord=0;

returnReturnPos;

voidRenew(charMaze[M][N],StackS[N*M],intfirst,intlast){

for(i=1;

M-1;

i++)

for(j=1;

N-1;

if(Maze[i][j]=='

!

'

Maze[i][j]='

while(first!

=last-1){

first++;

Maze[S[first].r][S[first].c]='

S[first].r=S[first].c=0;

//再此寻找路径时,从栈first开始到last寻找到迷宫中的位置

}//删除栈S[first]到S[last]间存储迷宫路径的节点

Maze[0][0]='

voidPathflag(charMaze[M][N],PosTypepre,PosTypemid,PosTypenext){

if(pre.r==next.r)Maze[mid.r][mid.c]='

1'

//'

─'

标志

else{

if(pre.c==next.c)Maze[mid.r][mid.c]='

2'

│'

else{

if(next.r==pre.r+1){

if(next.c==pre.c-1){

if(next.c==mid.c)Maze[mid.r][mid.c]='

3'

┌'

elseMaze[mid.r][mid.c]='

6'

┘'

}

else{

4'

┐'

5'

└'

}

else{

if(next.c==pre.c+1){

if(next.r==mid.r)Maze[mid.r][mid.c]='

voidPrintPath(StackS[N*M],inttop){

inti=0;

while(i<

=top){

if(i==top)

printf("

(%d,%d,%d)"

S[i].r,S[i].c,S[i].di);

else

(%d,%d,%d)→"

i++;

if(i%5==0)//输出5个路径元素时,进行换行操作

\n"

intMazePath(charMaze[M][N],PosTypestart,PosTypeend,StackS[N*M],inttop){

//求得一条从入口到出口的路径存放在栈中

//(从栈底到栈顶),并返回路径的步数

PosTypetest;

//探索位置

if(start.di>

4)return0;

//当方向数累加到4个以上时,就退出,说明无方向可走了

if(top!

=-1)top--;

S[++top]=start;

//把入口压栈

test=NextPos(start,start.di);

//设定"

当前测试位置"

为"

入口的东面通道块"

while(top>

=0){

if(Maze[test.r][test.c]=='

||Maze[test.r][test.c]=='

){

S[++top]=test;

S[top].ord=top;

//加入路径

if(top>

=2)

Pathflag(Maze,S[top-2],S[top-1],S[top]);

//留下不同的足迹

if(test.r==end.r&

test.c==end.c){

S[N*M-1].ord=top;

//用栈的最后一个单元的路径数来表示栈顶标志

returntop-1;

//返回路径的步数

}//到达终点(出口)并输出路径步数

test=NextPos(S[top],S[top].di);

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

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

if(S[top].r==start.r&

S[top].c==start.c)

start.di++;

//当退回到开始处时,将开始通道块的不可通的方向+1

if(top==0||start.di>

4){//退到入口或开始处,没有方向可行时,就说明无路径可走

S[N*M-1].ord=top+1;

//当start.di=4时,记录栈顶+1

break;

//当退到入口或开始处没有方向可行时,就说明无路径可走

//无路径可走,直接就跳出循环

if(S[top].di<

4){

S[top].di++;

test=NextPos(S[top],S[top].di);

//当前位置设为新方向的相邻块(有四种方案可供选择)

}//if

Maze[S[top].r][S[top].c]='

S[top].ord=0;

top--;

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

}//else

}//else

start.ord=0;

return0;

}//MazePath

voidPrintMaze(charMaze[M][N]){//打印迷宫

for(i=-1;

if(i==-1)

\t"

\t%5d"

i);

//打印出行序列号

j++){

if(i==-1)printf("

%2d"

j);

//打印出列序列号

switch(Maze[i][j]){

case'

:

printf("

入"

出"

■"

"

─"

│"

┌"

┐"

└"

┘"

printf("

voidPrintMaze1(charMaze[M][N]){//打印迷宫

%5d"

printf("

%c"

Maze[i][j]);

voidmain(){

DWORDstarttime,midtime,endtime;

charMaze[M][N];

//迷宫

PosTypestart,end;

//起点与终点

intdegree;

StackS[N*M];

//栈

inttop=-1;

intpath=0,testcase=1;

//path是记录路径的步数,testcase是记录迷宫的第一步选走方案

intfirst=0,last=0;

//在寻求其他路径时用first表示路径开始处,last表示路径结束处,first--last间的路径要消去

inti=0,minpath=N*M,minpathcase[N*M/3];

//记录最小路径minpath和其方案号序列i

system("

title可连通迷宫算法设计及实现"

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

\t\t\t★HELLO:

WelcomeTotheMazeGame\n\n"

\t\t\t学校:

西安建筑科技大学华清学院\n\n"

\t\t\t题目:

可连通迷宫算法设计及实现\n\n"

\t\t\t专业班级:

电子信息科学与技术0701\n\n"

\t\t\t学生:

\tXXXXXX\n\n"

\t\t\t指导老师:

do{

请按“enter”键开始算法的演示:

getchar();

printf("

选择迷宫难度等级(1最简单,4最难):

1,2,3,4\n\n"

);

scanf("

%d"

&

degree);

testcase=1;

first=last=0;

i=0;

minpath=N*M;

srand((unsignedint)time(NULL));

structtm*newtime;

//开始初始化迷宫

starttime=GetTickCount();

InitStartEnd(&

start,&

end,degree);

//随机初始化入口和出口

InitMaze(Maze,start,end,degree);

//随机初始化迷宫

//成功初始化迷宫

MazePath(Maze,start,end,S,top);

midtime=GetTickCount();

\n系统完全随机到的迷宫图如下:

\n\n"

Renew(Maze,S,start.ord,S[N*M-1].ord);

//复原迷宫

PrintMaze(Maze);

\n初始化迷宫时间为%d毫秒\n"

midtime-starttime);

请按“enter”键系统自动寻找路径:

"

midtime=GetTickCount();

while(testcase){

path=MazePath(Maze,start,end,S,top);

//迷宫可通行性

if(path){

Cast%d:

\t路径数:

%d;

\t路径图如下:

testcase,path);

PrintMaze(Maze);

if(path<

=minpath){

minpathcase[i++]=testcase;

//找出最短路径的方案号

minpath=path;

//找到最短路径的用minpath保存

PrintPath(S,S[N*M-1].ord);

//输出路径(以矩阵行列形式)

top=S[N*M-1].ord;

testcase++;

//查找结束

//printf("

\n请按“enter”键继续......\n"

//getchar();

start=S[--top];

//把路径的末端设置成开始,然后从末端开始寻找不一样的路径;

//一直到末端为迷宫的入口处,这样整个迷宫的可通路径查找完毕

start.di++;

first=start.ord;

last=S[N*M-1].ord;

Renew(Maze,S,first,last);

if(top==-1)break;

系统已经寻找出所有可通的路径!

\n\n其中最短路径为:

%d\n\n最短路径方案有:

minpath);

for(i=i-1;

i>

=0;

i--){

Case%d;

minpathcase[i]);

endtime=GetTickCount();

\n\n查找所有路径时间为%d毫秒\n"

endtime-midtime);

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

\n继续求解下一个迷宫请按“#”;

结束请按“enter”键!

}while(getchar()=='

\n****************************迷宫算法演示结束************************************\n"

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

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

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

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