電気、流したいですね。
流したいので、ここらへんから「電気を流して動かすにはどうすればいいか?」を考えながら進めていきます。
実際に電気を流して回路を動かしたときの動作を想像すると、こんな感じなんじゃないでしょうか。
- 回路内の導線のうち、一部は通電し、一部は通電しない
- 回路内のスイッチを切り替えると、どの部分が通電するかが変わる
そういう動きをプログラムで実現するにはどうすればよいか? おおまかなアイデアとしてはこんな感じでどうでしょうか。
- (1) 導線全体を部分に分け、
- (2) それぞれについて電気が通っているか、いないかを判断する。
とすると、部分に分けるところを先になんとかしないといけないですね。
そのために、まずはどのような単位(範囲)で通電の状態が変わるかを考えます。
今の時点で一番安直なのは WireFragment ごとに状態を持たせる方法ですが、これはちょっと考えただけでも冗長そうに思えます。
たとえばこの図の色を付けた部分で考えると、この WireFragment 9個*1はつねに同じように通電の状態が変化するでしょう。
つまり、9個のうち 5個だけ電気が流れていて残りは電気が流れていない、という状況は発生せず、9個すべてが通電している(スイッチが ON のとき)か、または9個すべてが通電していない(スイッチが OFF のとき)かのどちらかしか起こりえないはず。
そう考えると、この部分を1個のまとまりとして扱い、そのまとまりに1個だけフラグを持たせるようにした方が、データ構造が簡潔になり、取り扱いが楽になりそうです。
さて、「この部分」「1個のまとまり」と適当に言いましたが、 この「まとまり」とは一体何なんでしょうか?
結論を言ってしまうと、これは(グラフ理論でいうところの)グラフのエッジ(辺)ですね。 通電をどうするか上記のようにあれこれ考えていて、途中で気づきました。 これ、グラフだったのかー。なるほどなー。
というわけで、次は WireFragment をエッジごとにまとめる処理を作ります。
*1:スイッチの部分も 1個と数えています