寻找迷宫路径的成本

时间:2016-05-18 14:59:47

标签: c recursion flood-fill

我有这个迷宫:

    ##++##############
    ##++++++++++++++##
    ########++########
    ##++++++++##----##
    ##++########--####

“#”符号是迷宫中的墙壁。

迷宫的“+”区域是来自入口点的迷宫的可到达区域,并且迷宫的“ - ”区域不能从入口点到达。入口点位于迷宫的顶部。

我现在要做的是绘制迷宫中可到达区域的成本,如下所示:

    ##00##############
    ##++02++04++06++##
    ########++########
    ##++08++06##----##
    ##10########--####

这表明迷宫从入口到出口的成本为10。

迷宫顶部存储在2d数组中,我使用递归来解决可达区域。如何使用递归函数标记路径的成本,如下所示:

    void
    flood_fill(m_t * maze, int row, int col) {
        // If row,col is outside maze
        if ( row < 0 || row >= maze->height || col < 0 || col >= maze->width) return;
        // If row,col is not open
        if (maze->M[row][col].type != '.') return;

        // Mark row,col as part of path.
        maze->M[row][col].type = '+';

        // Go LEFT
        flood_fill(maze, row, col - 1);
        // Go DOWN
        flood_fill(maze, row + 1, col);
        // Go RIGHT
        flood_fill(maze, row, col + 1);
        // Go UP
        flood_fill(maze, row - 1, col);

        return;
    }

对于第一个迷宫,我在迷宫的顶部使用了这个递归函数,并用“+”填充所有可到达的单元格。

是否有任何关于我如何能够做类似事情的建议,而是考虑路径成本。我只是在寻找一些关于如何实现它的例子或建议。关于如何实现第二个迷宫示例的任何帮助都会有所帮助。

1 个答案:

答案 0 :(得分:1)

传递一个额外的参数,这是迄今为止的路径成本。

flood_fill(m_t * maze, int row, int col, int cost)

每个迷宫位置都会获得一个附加属性 .cost ,您可以在填充迷宫时更新该属性。将成本初始化为MAXINT作为标记。 例如,

    if (maze->M[row][col].cost > cost)
      maze->M[row][col].cost = cost

    // Go LEFT
    flood_fill(maze, row, col - 1, cost+1);
    // repeat for the other 3 directions

无论如何,你现在每个广场都有成本。将迷宫转储到屏幕时,根据需要显示。