2017-11-10 14 views
2

私は、異なるノードを持つグリッドを持っています。すべてのノードには、trueまたはfalseに設定できるプロパティがあり、それを「lighted」と呼ぶことができます。エリアグリッド内の影響を受けたノードを追跡する

ノードによっては、「ライト」を設定できます。これらのライトには範囲があり、影響を受けるノードの「ライト付き」プロパティはtrueに設定されます。光が範囲内にない限り、ノードは「点灯」のままになります。

ノードの設定や、ライトが設定されているときに影響を受けるノードの確認に問題はありません。

しかし、私はライトを消すことに対処する方法がわかりません:ライトをオンにすると、影響を受けたノードを点灯させなければならないことがわかります。ライトをオフにすると、別のライトの影響を受ける可能性があるため、ノードによっては点灯したままになることがあります。

私の最初のアプローチは、どれくらいの光がそれに影響を与えているかを各ノードに知らせることでした。そして、ライトが消灯したら、影響を受けたノードの値を減らしてください。

シンプルですが、移動ライトを実装するとコードが乱雑になり、元のライトを破棄して新しい位置に新しいライトを作成する必要があります。

この問題に対処するより効率的な方法は、スピードでありストレージではなく、主な問題ではないでしょうか?

詳細:グリッドは、ノードのないセルを持つことができます。実際、グリッドの半分以上にノードがないため、現在、ノード情報を格納するために辞書を使用しています。

グリッドにはいくつかのサイズがありますが、極端な場合は100x100です。

固定ライトと移動ライトが複数存在することがありますが、ユーザーの入力に依存するため、同時に30個を超えることはありません。

+1

光源が多いですか?あなたのグリッドは大きいですか?光源が作成、破壊、移動するよりも頻繁にセルが点灯するかどうかをチェックしますか?これらのことはおそらく、どのアプローチが最も効率的であるかを知る上で役割を果たすでしょう。各セルのライト数を維持するという考えは悪くはありません。セルを複数回カウントしないように注意すると、コードが乱雑にならないはずです。 –

+0

上記の説明を追加します。 – Leo

答えて

1

私は実際には2つの選択肢しか見ることができません - 光源が消灯したときにどのノードをオフにするべきかを計算することはあまりにも重いことに気づいたと思います。だから、残りの選択肢:

  1. 光が消えたとき、最初からすべて点灯したノードを再計算(ライトが点灯したときに、あなたが全体を再計算せずに更新し続けることができます)。

  2. 提案したように、指定されたノードごとに点灯しているノードの数を追跡します。真か偽lightsource、そしてlightlevel int型である:各ノードが2つのプロパティを持っている想像 -

は、私は2番目の提案は、あなたの精神的なモデルを作り直す場合は特に、勝者だと思います。設定可能なノードで lightsourceを更新できます。そして lightlevelは、このノード上で光をキャストしているノードの数を追跡します。レベルが1以上の場合は、質問からのフレーズで と書かれたです。 (そして、私は、 lightsourceがtrueに設定されている場合、各設定可能なノードは自分自身の lightlevelに1を加えていると思います)。

実際の視覚光をモデリングする場合など、lightlevelなどのノードの表示方法が異なるなど、モデリング対象によってはこの追加情報を使用することもできます。

+0

私は最終的に実装しました。ライトがアクティブになるとライトは影響を受けるノードを保存します。ライトがオフになると、影響を受けたノードを再計算せずにノードが呼び出されます。偶然にノードを2回点灯させたとしても、ノードをライトの情報に2回保存するので、ノードを元に戻すことができます。あなたがあなたの答えにこの部分を加えるならば(あなたが持っているならあなた自身の入力も)私は正しい答えを設定します。だから他のすべての情報を1つの答えにパックしている:) – Leo

関連する問題