/*/////////////问题描述!<Aldus-Broder算法>////////////////////////////
利用0/12维数组表示迷宫,0表示开路,1表示障碍物
两种迷宫1:4连通的 top bottom right left 4个方向
2:8连通 东 南 西 北 西北 西南 东北 东南 8个方向
由于迷宫中不是没个位置都有4/8个方向?
解决办法:将边界位置都设置成墙,既数组值为1
m*p的迷宫问题 用(m+2)*(p+2)的2维数组表示 入口点(1,1)
出口点 (m,p)////
算法:步骤1:设置随机种子
步骤2:初始化,将迷宫中所有区域都设置为墙体
步骤3:设置迷宫入口和出口位置,并将其设置成通路
步骤4:雕刻(Carved)横向和纵向偶数位置的墙体保证不存在连续的方形墙体
步骤4.1:如果迷宫中所有的 偶数位置都被设置成通路,则迷宫完成,退出算法
步骤4.2:如果当前搜索区域位于迷宫边缘,则设置成特殊的方向选择变量dir,
dir的选择也需要加入随机成分
步骤4.3:再加入一个随机方向变量
步骤4.4:联合以上2个随机变量,根据选择的方向确定下一步的当前位置,
如果该位置不合法,则跳回步骤4.1否则该位置对应的对角是否是墙。
如果是则打通相应对角位置和该对角位置的随即方向的逆方向的一个区域
然后跳回步骤4.1
/////////////////////////////////////////*/
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int row=50;
int col=50;
int SIZEX_MAZE=row*2+1;
int SIZEY_MAZE=col*2+1;
const int CONST_MAZEX=101;
const int CONST_MAZEY=101;
#define R 2//you
#define L -2//zuo
#define D 1//xia
#define U -1//shang
int maze[CONST_MAZEX][CONST_MAZEY]={1};
void CreateMaze();
bool IsNewCell(int x,int y);//是否
bool IsCoverd();//是否雕刻
bool IsLegalArea(int x,int y);//是否合法区域
bool IsNewCell(int x,int y)
{//判断与(x,y)位置对应的位置(2*y-1,2*x-1)是否被设置过了,即是否被定义成通路
//(2*y-1,2*x-1)是由于迷宫的边界都设置成墙体
if(maze[y*2-1][x*2-1]==0)
return false;
else
return true;
}
bool IsCoverd()
{
//判断迷宫的偶数位置是否的都已经处于通路,即所有形如(2*x-1,y*2-1)的值是否都设置为0
for(int i=0;i<=col;i++)
{
for(int j=0;j<=row;j++)
{
if(IsNewCell(i,j)==true)
return false;
}
}
return true;
}
bool IsLegalArea(int x,int y)
{
if(x>col||x<1||y>row||y<1)
return false;
return true;
}
void CreateMaze()
{
//步骤1:设置随机种子
srand(time(NULL));
//步骤2:初始化
for(int i=0;i<SIZEX_MAZE;i++)
for(int j=0;j<SIZEY_MAZE;j++)
maze[i][j]=1;
int currX,currY;
int temp1;
int dir=0;
/////
//步骤:3 设置迷宫入口(1,1)
maze[1][1]=0;
currX=currY=1;
cout<<"mei jin xun huan"<<endl;
//步骤4: 雕刻墙体,保证不存在连续的方形墙体
for(int k=0;;k++)
{
//cout<<" jin xun huan le"<<endl;
dir=0;
//如果雕刻完成,则迷宫设置完成
if(IsCoverd()==true)
break;
///x为1
if(currX==1)
{
temp1=rand()%6;
if(currY==1)
{
if(temp1%2==0)
dir=R;
else
dir=D;
}
else if(currY==row)
{
if(temp1%2==0)
dir=R;
else
dir=U;
}
}
////x为 col
if(currX==col)
{
temp1=rand()%6;
if(currY==1)
{
if(temp1%2==0)
dir=L;
else
dir=D;
}
else if(currY==row)
{
if(temp1%2==0)
dir=L;
else
dir=U;
}
}
temp1=rand()%4;
if(temp1==0||dir==R)
{
if(dir==R)
dir=0;
currX++;
if(IsLegalArea(currX,currY)==false)
{
currX--;
continue;
}
if(IsNewCell(currX,currY)==true)
{
maze[currY*2-1][currX*2-1]=0;
maze[currY*2-1][currX*2-2]=0;
}
continue;
}
else if(temp1==1||dir==L)
{
if(dir==L)
dir=0;
currX--;
if(IsLegalArea(currX,currY)==false)
{
currX++;
continue;
}
if(IsNewCell(currX,currY)==true)
{
maze[currY*2-1][currX*2-1]=0;
maze[currY*2-1][currX*2]=0;
}
continue;
}
else if(temp1==2||dir==D)
{
if(dir==D)
dir=0;
currY++;
if(IsLegalArea(currX,currY)==false)
{
currY--;
continue;
}
if(IsNewCell(currX,currY)==true)
{
maze[2*currY-1][2*currX-1]=0;
maze[currY*2-2][2*currX-1]=0;
}
continue;
}
else if(temp1==3||dir==U)
{
if(dir==U)
dir=0;
currY--;
if(IsLegalArea(currX,currY)==false)
{
currY++;
continue;
}
if(IsNewCell(currX,currY)==true)
{
maze[2*currY-1][2*currX-1]=0;
maze[2*currY][2*currX-1]=0;
}
continue;
}
}
}
void main()
{
cout<<"aaaaaaaa"<<endl;
CreateMaze();
for(int i=0;i<=101;i++)
{
for(int j=0;j<=101;j++)
{
cout<<maze[i][j];
}
cout<<endl;
}
cout<<"aaaaaaaa"<<endl;
}
评论0