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,这比迷宫中生成的任何东西都要大。这样,任何实际成本都会更便宜,而且你会自动填写。那么就不需要检查标记值。