C++递归分割生成迷宫,结果不对
namespace RecurseDivide{
void divide(Maze& m,int left,int right,int top,int bottom);
Maze generate(int row,int col){
Maze result(row,col);
divide(result,0,col-1,0,row-1);
return result;
}
void divide(Maze& m,int left,int right,int top,int bottom){
if(right-left<1||bottom-top<1){
return;
}
int x=rand()%(right-left)+left;
int y=rand()%(bottom-top)+top;
int upRd=rand()%(y-top+1)+top;
int downRd=rand()%(bottom-y)+y;
int leftRd=rand()%(x-left+1)+left;
int rightRd=rand()%(right-x)+right;
int dire=rand()%4; //0-左 1-右 2-上 3-下
switch (dire)
{
case 0:{
m.connect((y+1)*(m.Col())+rightRd,y*(m.Col())+rightRd);
m.connect(upRd*(m.Col())+x,upRd*(m.Col())+x+1);
m.connect(downRd*(m.Col())+x,downRd*(m.Col())+x+1);
break;
}
case 1:{
m.connect((y+1)*(m.Col())+leftRd,y*(m.Col())+leftRd);
m.connect(upRd*(m.Col())+x,upRd*(m.Col())+x+1);
m.connect(downRd*(m.Col())+x,downRd*(m.Col())+x+1);
break;
}
case 2:{
m.connect((y+1)*(m.Col())+leftRd,y*(m.Col())+leftRd);
m.connect((y+1)*(m.Col())+rightRd,y*(m.Col())+rightRd);
m.connect(downRd*(m.Col())+x,downRd*(m.Col())+x+1);
break;
}
case 3:{
m.connect((y+1)*(m.Col())+leftRd,y*(m.Col())+leftRd);
m.connect((y+1)*(m.Col())+rightRd,y*(m.Col())+rightRd);
m.connect(upRd*(m.Col())+x,upRd*(m.Col())+x+1);
break;
}
default:
break;
}
//左上
divide(m,left,x,top,y);
//右上(x,x+1为衔接处)
divide(m,x+1,right,top,y);
//左下
divide(m,left,x,y+1,bottom);
//右下
divide(m,x+1,right,y+1,bottom);
}
生成的迷宫通路非常少
而且调试的时候还会于connect函数发生段错误越界,因为10x10的迷宫测试中,connect函数有连接过100和90,100显然越界了,但是不知道为什么出现100