一.设置迷宫
要打印一个简单的迷宫,我们理所当然的想到了利用二维数组,在迷宫的实现中我定义了一个maze.txt的文件用来存储迷宫,在初始化的时候只需要将该迷宫从maze.txt中读出来就可以了.
0-路
1-墙
二.如何找到迷宫的通路
(1).如果当前路径已经走过则要留下标记;如果走到死胡同也要留下标记,但是要体现回溯,所以这两种情况的标记最好不同
(2).找迷宫路径的可通路可理解为使用试探法.
即在一个结点的上,下,左,右四个方向进行试探,如果某一个方向满足迷宫位置要求则将该位置压栈;如果走到死胡同此时该位置的四个方向都不可通(之前已经将走过的路标记为2),我们只需要将该位置出栈即可.
(3).判断是否走出迷宫.
因为迷宫的出口只可能在边界,我们可以认为三个方向都可能存在出口.所以在判断是否走出迷宫的时候,我们可以在除了入口的那一面都进行判断.
三.递归代码实现.(体现回溯和找到迷宫出口)
#include <iostream>
#include <string>
using namespace std;
#include <assert.h>
struct Seat
{
Seat(int x, int y)
:_x(x)
,_y(y)
{}
int _x;
int _y;
};
class Maze
{
public:
Maze(FILE* fp, int row, int col)
:_row(row)
,_col(col)
{
_map = new char*[10];
for(int index = 0; index < 10; ++index)
{
_map[index] = new char[10];
}
for(int i = 0; i < _row; ++i)
{
for(int j = 0; j < _col; ++j)
{
_map[i][j] = fgetc(fp);
if(_map[i][j] == '\n' || _map[i][j] == ' ')//跳过空行
--j;
}
}
}
bool IsPass(const Seat& s)const
{
if(_map[s._x][s._y] == '1' )
return true;
return false;
}
bool PassMaze(Seat& s)
{
if(s._x>_row || s._x<0 || s._y<0 || s._y>_col)
return true;
if(IsPass(s))