我有这个迷宫:
##++##############
##++++++++++++++##
########++########
##++++++++##----##
##++########--####
“#”符号是迷宫中的墙壁。
迷宫的“+”区域是来自入口点的迷宫的可到达区域,并且迷宫的“ - ”区域不能从入口点到达。入口点位于迷宫的顶部。
我现在要做的是绘制迷宫中可到达区域的成本,如下所示:
##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;
}
对于第一个迷宫,我在迷宫的顶部使用了这个递归函数,并用“+”填充所有可到达的单元格。
是否有任何关于我如何能够做类似事情的建议,而是考虑路径成本。我只是在寻找一些关于如何实现它的例子或建议。关于如何实现第二个迷宫示例的任何帮助都会有所帮助。
答案 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
无论如何,你现在每个广场都有成本。将迷宫转储到屏幕时,根据需要显示。