迷宫问题算法分析
2013-06-24 21:36
531 查看
首先给出经典的算法,然后分析算法的实现
#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里面的条件哦,这样的话,就能将所有的路径遍历出来,怎么样?这个算法还是蛮经典嘛,当然我在这里只是将这个经典算法分析一下, 有更好的方案, 还请大家不吝赐教。
#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里面的条件哦,这样的话,就能将所有的路径遍历出来,怎么样?这个算法还是蛮经典嘛,当然我在这里只是将这个经典算法分析一下, 有更好的方案, 还请大家不吝赐教。
相关文章推荐
- 算法分析——走迷宫问题
- 迷宫问题算法分析
- 算法分析——走迷宫问题
- [C++]数据结构:算法分析之八皇后问题
- 数据结构据与算法分析中的最大字数列求解问题
- 算法分析--排列问题
- 算法分析之众数问题O(nlogn)
- Java矩阵连乘问题(动态规划)算法实例分析
- Golang算法之田忌赛马问题实现方法分析
- 分治法编程问题之最接近点对问题的算法分析
- 经典算法之迷宫问题
- 球问题算法分析
- 算法分析:求最近点对问题(c++)
- 【算法设计与分析】2、棋盘覆盖问题
- 最接近点对问题的算法分析 (转帖)
- 【算法分析与设计】最小生成树问题
- java面试宝典 之 物流配送路径优化问题分析与算法解读
- n阶Hanoi塔问题 - 算法设计与分析实验1
- 算法导论5.4 概率分析和指示器随机变量的进一步使用--几个有趣的问题
- 算法分析与设计2017-2-背包问题的贪心算法