1

タイルマップを使用するゲームに取り組んでいます。マップ上の四角形は、壁である場合もあれば、空である場合もあります。私が開発しようとしているアルゴリズムは、マップ上のポイントを取り、そのポイントから到達できるセルの数を返す必要があります (ポイントを含むセクターの面積に等しい)。

アルゴリズムを実行する関数が、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 回呼び出される可能性があります)。

4

1 に答える 1