首先给出经典的算法,然后分析算法的实现
#define MAX_SIZE 8
int H[4] = { 0, 1, 0, -1 };
int V[4] = { -1, 0, 1, 0 };
char Maze[MAX_SIZE][MAX_SIZE] =
{{'X','X','X','X','X','X','X','X'},
{'o','o','o','o','o','X','X','X'},
{'X','o','X','X','o','o','o','X'},
{'X','o','X','X','o','X','X','o'},
{'X','o','X','X','X','X','X','X'},
{'X','o','X','X','o','o','o','X'},
{'X','o','o','o','o','X','o','o'},
{'X','X','X','X','X','X','X','X'}};
void FindPath(int X, int Y)
{
if(X == MAX_SIZE || Y == MAX_SIZE)
{
for(int i = 0; i < MAX_SIZE; i++)
for(int j = 0; j < MAX_SIZE; j++)
printf("%c%c", Maze[i][j], j < MAX_SIZE-1 ? ' ' : '\n');
}
else
for(int k = 0; k < 4; k++)
if(X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE
&& 'o' == Maze[X][Y])
{
Maze[X][Y] = ' ';
FindPath(X+V[k], Y+H[k]);
Maze[X][Y] = 'o';
}
}
int main(int argc, char* argv[])
{
FindPath(1,0);
}
首先解释一下迷宫问题,就是从一个迷宫中找出从指定的起点到终点的所有的可能的路径的问题
在上面的例子('o'表示路径可行,‘X’表示路径不通)中其实是从一个6X8的迷宫中找出所有的可能的路径,增加了两行‘X’方便程序的处理,这样问题就成了从一个8X8的迷宫中找路径的问题了 ,起点是(1,0)终点是(6,7)。
FindPath(1,0); //当然是从起点开始找路径的意思了
进入到递归函数中去了之后显然是执行的else里面的语句
else
for(int k = 0; k < 4; k++)//这个for loop啥意思呢, 很容易想到是要遍历当前位置的上下左右的位置的意思
if(X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE
&& 'o' == Maze[X][Y])
{
Maze[X][Y] = ' ';//这里为什么要将符合条件的位置置空,有两个用途1,放置遍历过的位置重复遍历,退出一层递归(在这里是不满足else的条件时)的时候方便输出结果(可先运行代码查看结果)
FindPath(X+V[k], Y+H[k]);//从V[k],H[k]可以看出V 和H这两个数组是来表示位置的 (X+(-1),Y+0)就是表示方的的位置, 从这里可以看出遍历当前位置的临近位置的顺序是up、right、bottom、left
Maze[X][Y] = 'o'; //递归退出之后要将当前我位置恢复, 否则的话, 该递归最多只能找到一种路径
}
再看退出一层递归时执行的代码
if(X == MAX_SIZE || Y == MAX_SIZE)
{
for(int i = 0; i < MAX_SIZE; i++)
for(int j = 0; j < MAX_SIZE; j++)
printf("%c%c", Maze[i][j], j < MAX_SIZE-1 ? ' ' : '\n');
}
//很明显是将这个8X8的数组按照一定的格式输出,注意输出之后整个递归过程并没有退出这是(X,Y)往往又会满足else里面的条件哦,这样的话,就能将所有的路径遍历出来,怎么样?这个算法还是蛮经典嘛,当然我在这里只是将这个经典算法分析一下, 有更好的方案, 还请大家不吝赐教。