C 寻找迷宫路径的成本

C 寻找迷宫路径的成本,c,recursion,flood-fill,C,Recursion,Flood Fill,我有一个迷宫: ##++############## ##++++++++++++++## ########++######## ##++++++++##----## ##++########--#### “#”符号是迷宫中的墙壁 迷宫的“+”区域是从入口点可以到达的迷宫区域,而“-”区域是从入口点无法到达的。入口点位于迷宫的顶部 我现在想做的是绘制迷宫中可到达区域的成本,如下所示: ##00############## ##++02++

我有一个迷宫:

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

迷宫的“+”区域是从入口点可以到达的迷宫区域,而“-”区域是从入口点无法到达的。入口点位于迷宫的顶部

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

    ##00##############
    ##++02++04++06++##
    ########++########
    ##++08++06##----##
    ##10########--####
    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;
    }
这表明迷宫从入口到出口需要花费10英镑

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

    ##00##############
    ##++02++04++06++##
    ########++########
    ##++08++06##----##
    ##10########--####
    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;
    }
void
溢流填充(迷宫、整行、整列){
//若为row,则col位于迷宫外
如果(行<0 | |行>=迷宫->高度| |列<0 | |列>=迷宫->宽度)返回;
//如果为行,则列未打开
如果(maze->M[row][col]。输入!='.')返回;
//将行、列标记为路径的一部分。
迷宫->M[行][col].类型='+';
//向左走
洪水填充(迷宫、世界其他地区、第1列);
//下降
洪水填充(迷宫,行+1,列);
//向右转
洪水填充(迷宫、行、列+1);
//上升
洪水填充(迷宫,第1行,第2列);
返回;
}
对于第一个迷宫,我在迷宫顶部使用了这个递归函数,它用“+”填充了所有可到达的单元格


有什么建议,我可以做类似的事情,但路径成本代替。我只是想找一些例子或建议,看看我该怎么做。任何关于如何实现第二个迷宫示例的帮助都会很有帮助

传递一个额外的参数,该参数是到目前为止的路径成本

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

在任何情况下,你现在有成本的每一个广场。将迷宫转储到屏幕时,按需要显示。

注意:由于是深度优先搜索,点的成本可能不是最短的。对。如果迷宫中有电路,深度优先算法可能会先填充一个高值,再填充一个低值。在指定.Right之前,需要检查现有值。打印迷宫时,所有数据都在“指尖”处。填写成本后,您可以在每个迷宫位置进行检查,并决定是打印++还是打印数值。我无法给出具体的更改,因为您没有包含迷宫打印代码。我希望你能自己做那部分?需要更改
if(maze->M[row][col].type!='..)返回值;迷宫->M[行][col].类型='+'。实际上,您可能想使用MAXINT,这比迷宫中生成的任何东西都要大。这样,任何实际成本都会更便宜,而且你会自动填写。那么就不需要检查标记值。