用递归回溯算法求解迷宫

时间:2015-12-30 14:28:13

标签: c++ algorithm recursion big-o time-complexity

我在C ++中实现了this递归回溯算法来创建迷宫求解程序。

FIND-PATH(x, y)
if (x,y outside maze) return false
if (x,y is goal) return true
if (x,y not open) return false
mark x,y as part of solution path
if (FIND-PATH(North of x,y) == true) return true
if (FIND-PATH(East of x,y) == true) return true
if (FIND-PATH(South of x,y) == true) return true
if (FIND-PATH(West of x,y) == true) return true
unmark x,y as part of solution path
return false

我无法分析此算法的时间复杂度。

这是我的实现(我为了这个问题而简化了,实际实现使用了一些额外的检查来确定首先尝试的四个方向中的哪一个):

bool Maze::FindPath(int x, int y)
{
    if (isOutsideMaze(x, y)) return false;

    if (maze[x][y].isBad) return false;

    if (x == goalX && y == goalY)
    {
        maze[x][y].isBad = false;
        return true;
    }

    if (maze[x][y].isBlocked)
    {
        maze[x][y].isBad = true;
        return false;
    }

    maze[x][y].isBad = true;

    if (FindPath(x, y + 1) == true) return true;
    if (FindPath(x - 1, y) == true) return true;
    if (FindPath(x + 1, y) == true) return true;
    if (FindPath(x, y - 1) == true) return true;

    maze[x][y].isBad = false;
    return false;
}

所以,问题是,这个算法在最差和普通情况下的时间复杂度(大O)是什么,我该如何计算?我曾尝试在其他stackoverflow问题和Google上寻找解释,但还没找到我想要的东西。非常感谢任何帮助。

修改

是否有正式的方法来确定递归算法的时间复杂度?可以使用递归关系来计算时间复杂度吗?

另外,假设这个算法的递归关系类似于T(n) = 4T(n/4) + 1,我是否正确?

修改

最糟糕的情况是Start和Goal单元格之间的最大距离,并且两者之间存在最大数量的“开放”单元格。如下图所示。根据我的观察,算法的行为如图所示。这不是O(n)吗?如果没有,您如何解释? Image depicting worst-case behaviour of the algorithm. Isn't it O(n)? If not, how do you explain that?

0 个答案:

没有答案