quiz : 解答編 : Concurrent Clean : アルゴリズム

[id:lethevert:20060324:p2]のクイズの解答編です。(というか、ただ、私が解けただけなのですが)
もし、まだ考えている方がいたら(いないと思いますけど)、ネタばれ注意です。

プログラムの流れ

align nodes arcs --> draw --> fwritess

というのが基本的な流れです。
まず、align nodes arcsで頂点の配置を計算し、それに従ってdrawで頂点をキャンバスにプロットし、fwritessでキャンバスを描画します。
実際には、計算経過も出力するので、次のようにalign nodes arcsがリストを出力するようになっています。

align nodes arcs --> map (fwritess o draw)

align関数

alignは、次の流れで成り立っています。

align = initCell --> alignY --> alignX

initCellで頂点の配置を初期化し、alignYで頂点の上下の位置を決め、alignXで頂点を左寄せします。
alignXは、1つ目の頂点から順に、その頂点より前の連結している頂点の全ての位置より後ろで、もっとも前の位置に寄せていきます。

alignY関数

alignYがアルゴリズムの中心です。
最後尾の頂点から、深さ探索の行きがけにラベルを貼っていきます。ただし、一度、訪れた頂点は、2回訪れません。
ラベルは、0から始まり、バックトラックするごとに1が加算されます。最終的に、このラベルがY座標(上下の位置)になります。