【发布时间】:2015-03-13 04:24:59
【问题描述】:
我正在开发一款使用瓷砖地图的游戏。地图上的方格可以是墙也可以是空的。我正在尝试开发的算法应该在地图上取一个点并返回从该点可以到达的单元格的数量(等于包含该点的扇区的面积)。
让执行算法的函数取一个 x 坐标、一个 y 坐标和一个二维数组形式的地图。
function sectorArea(x_coord,y_coord,map) { ... }
假设地图看起来像这样(其中 1 代表墙壁):
map = [0,0,1,0,0,0],
[0,0,1,0,0,0],
[1,1,1,0,0,0],
[0,0,0,0,0,0]
然后是sectorArea(0,0,map) == 4 和sectorArea(4,0,map) == 15。
我的幼稚实现是递归的。目标单元格被传递给go 函数,然后在任何相邻的空单元格上递归 - 最终传播到扇区中的所有空单元格。它运行得太慢,很快就达到了调用堆栈限制:
function sectorArea(x_coord,y_coord,map) {
# First convert the map into an array of objects of the form:
# { value: 0 or 1,
# visited: false }
objMap = convertMap(map);
# The recursive function:
function go(x,y) {
if ( outOfBounds(x) || outOfBounds(y) ||
objMap[y][x].value == 1 || objMap[y][x].visited )
return 0;
else
objMap[y][x].visited = true;
return 1 + go(x+1,y) + go(x-1,y) + go(x,y+1) + go(x,y-1);
}
return go(x_coord,y_coord);
}
谁能推荐一个更好的算法?如果足够准确,非确定性解决方案实际上会很好,因为速度是主要问题(该算法可以在单个滴答中的不同点上调用 3 或 4 次)。
【问题讨论】: