3すくみ問題

掲示板の方にさんざん三つ巴がどうのと自分で書いていたくせに
すっかり忘れてました。

で、やねさんのハテナで思い出した次第。



前回の説明では↑のように3すくみが発生すると 以下のようなグラフになります。  0 1 2 ┌─┬─┬─┐ │A│B│C│ ├─┼─┼─┤ │1│2│0│ └─┴─┴─┘ これを描画しようとするとA→B→C→A→B→C→というように参照の無限再帰となり、 しまいにスタックオーバーフローして死にます。 ここはババンと、小市民的に富豪的プログラミングをすることにしました。 まず描画対象となるキューブをスタックに登録していきます。 描画時にスタックを検索し、描画対象キューブより優先度の高いキューブがスタックに すでに存在する場合、3すくみが発生していることになるので、そのキューブは優先度 が高くても描画しないことにします。 また、上記2次元配列にもうひとつ「3すくみ発生」次元を加えて3次元配列としてます。 (これも説明のためのもので実装は3次元配列ではないです) で、3すくみ発生次元に描画しようとしているキューブを登録します。 キューブを描画する際に3すくみ発生検出した場合、重なる部分を描画しないようにします。
実際には どんな動きになるかというと、 ・Aを描画しようとする ・Aをスタックにプッシュ ・Aより優先度が高いBが存在するので、Bを描画することにする ・Bをスタックにプッシュ ・Bより優先度が高いCが存在するので、Cを描画することにする ・Cをスタックにプッシュ ・Cより優先度が高いAが存在するので、Aを描画することにする......が! ・スタックにAが存在するので、3すくみ発生検出! ・Aの3すくみ発生検出リストにCを登録 ・Cを描画 ・Cをスタックからポップ ・Bを描画 ・Bをスタックからポップ ・Aを描画.....しようとするが! ・Aの3すくみ発生リストにCが登録されているので、AとCでマスクを作成 ・Aを描画 ・Aをスタックからポップ
以上です。 まだ、なんか抜けてることがあるんだろうか。