迷宫算法是一个比较简单的算法,是在迷宫里如何通过从入口找到出口,总的思路来是:每一条路都是由两面呢墙壁组成,并且是每一面是连续的,只要我们从入口延着一个墙壁一直走,例如一直沿着右手边的墙壁来走,就一定可以找到出口,即便是一个死胡同,沿着墙壁也可以绕出来。
**** ****
**** * **
**** * *
**** ** *
** * *
** ** *
* ******
*T*******
上图可以看成一个简易的迷宫,*代表墙,空格代表通路,从下面开始要想找到上面那个出口,应该可以沿着右手边(或者左手边的)的墙一直前进,如果有拐弯就看右边墙的墙的走向。
基本数据结构:在每个位置是,有横纵坐标两个变量,还有在这个位置所面朝的方向
int position_x;
int position_y;
direction forward //direction是个枚举类型,有四个方向 north、south、east、west
核心思想:
在每个位置上时,先判断在所面临方向的右边是否是墙,如果不是墙就向右拐,如果是墙就判断是前方是不是墙,如果前方不是墙就直行,如果前方也是墙,就要更改当前位置所处的方向,让方向向左转。依次类推,直到找到出口
在具体实现上定义了两个类,一个是迷宫的地图类,一个是走迷宫的人的类
void maze_person::start()
{
char str;
int right_x,right_y;
int ahead_x,ahead_y;
str=maze_mpp::getMazeRoad();
while(!(maze_mpp::checkMazeDoor(position_x,position_y))){
gotoxy(position_x,position_y);
cout<<str;
switch (forward)
{
case (NORTH):
right_x=position_x;
right_y=position_y+1;
ahead_x=position_x-1;
ahead_y=position_y;
break;
case (SOUTH):
right_x=position_x;
right_y=position_y-1;
ahead_x=position_x+1;
ahead_y=position_y;
break;
case (EAST):
right_x=position_x+1;
right_y=position_y;
ahead_x=position_x;
ahead_y=position_y+1;
break;
case (WEST):
right_x=position_x-1;
right_y=position_y;
ahead_x=position_x;
ahead_y=position_y-1;
break;
}
if (maze_mpp::checkWallOrNot(right_x,right_y)) //右侧是墙
{
if (maze_mpp::checkWallOrNot(ahead_x,ahead_y)) //右侧是墙,前侧是墙
{
turnleft();
}
else //右侧是墙,前侧不是墙
{
position_y=ahead_y;
position_x=ahead_x;
gohead();
gotoxy(position_x,position_y);
cout<<person;
maze_mpp::count++;
Sleep(1000);
}
}
else //右侧不是墙
{
position_x=right_x;
position_y=right_y;
turnright();
gotoxy(position_x,position_y);
cout<<person;
maze_mpp::count++;
Sleep(1000);
}
}
}
为了能够自动执行,我们不断更改光标所在的位置
void maze_person::gotoxy(int x,int y)
{
COORD cd;
cd.X=y;
cd.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);
}
同时,算法中turnleft()如下,turnright()和gohead()方法类似
void maze_person::turnleft()
{
switch (forward)
{
case (NORTH):
forward=WEST;
break;
case (SOUTH):
forward=EAST;
break;
case (EAST):
forward=NORTH;
break;
case (WEST):
forward=SOUTH;
break;
}
}
主函数如下:
int main(){
int map1[8][9] = {
{1,1,1,1,0,1,1,1,1},
{1,1,1,1,0,1,0,1,1},
{1,1,1,1,0,1,0,0,1},
{1,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,1,0,1},
{1,1,0,1,1,0,0,0,1},
{1,0,0,1,1,1,1,1,1},
{1,0,1,1,1,1,1,1,1}
};
maze_mpp maze;
maze.set_mazemap(&map1[0][0],8,9);
maze.setMazeWall('*');
maze.drawmap();
maze_person *personer=new maze_person(7,1,NORTH);
personer->gotoxy(7,1);
cout<<personer->getperson();
personer->start();
system("pause");
return 0;
}