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