kairo-gokko (4-1) データの整形 2



電気、流したいですね。

流したいので、ここらへんから「電気を流して動かすにはどうすればいいか?」を考えながら進めていきます。


実際に電気を流して回路を動かしたときの動作を想像すると、こんな感じなんじゃないでしょうか。

  • 回路内の導線のうち、一部は通電し、一部は通電しない
  • 回路内のスイッチを切り替えると、どの部分が通電するかが変わる

そういう動きをプログラムで実現するにはどうすればよいか?   おおまかなアイデアとしてはこんな感じでどうでしょうか。

  • (1) 導線全体を部分に分け、
  • (2) それぞれについて電気が通っているか、いないかを判断する。

とすると、部分に分けるところを先になんとかしないといけないですね。

そのために、まずはどのような単位(範囲)で通電の状態が変わるかを考えます。


今の時点で一番安直なのは WireFragment ごとに状態を持たせる方法ですが、これはちょっと考えただけでも冗長そうに思えます。

f:id:sonota88:20200217070716p:plain

たとえばこの図の色を付けた部分で考えると、この WireFragment 9個*1はつねに同じように通電の状態が変化するでしょう。

つまり、9個のうち 5個だけ電気が流れていて残りは電気が流れていない、という状況は発生せず、9個すべてが通電している(スイッチが ON のとき)か、または9個すべてが通電していない(スイッチが OFF のとき)かのどちらかしか起こりえないはず。

そう考えると、この部分を1個のまとまりとして扱い、そのまとまりに1個だけフラグを持たせるようにした方が、データ構造が簡潔になり、取り扱いが楽になりそうです。


さて、「この部分」「1個のまとまり」と適当に言いましたが、 この「まとまり」とは一体何なんでしょうか?


結論を言ってしまうと、これは(グラフ理論でいうところの)グラフのエッジ(辺)ですね。 通電をどうするか上記のようにあれこれ考えていて、途中で気づきました。 これ、グラフだったのかー。なるほどなー。


というわけで、次は WireFragment をエッジごとにまとめる処理を作ります。



*1:スイッチの部分も 1個と数えています