タイルマップを使用するゲームに取り組んでいます。マップ上の四角形は、壁である場合もあれば、空である場合もあります。私が開発しようとしているアルゴリズムは、マップ上のポイントを取り、そのポイントから到達できるセルの数を返す必要があります (ポイントを含むセクターの面積に等しい)。
アルゴリズムを実行する関数が、x 座標、y 座標、および 2D 配列の形式のマップを取るとします。
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);
}
誰かがより良いアルゴリズムを提案できますか? 速度が主な問題であるため、十分に正確である場合、非決定論的なソリューションは実際には問題ありません (アルゴリズムは、1 つのティック中に異なるポイントで 3 回または 4 回呼び出される可能性があります)。