t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA ExcelVBAでパズルを解こう読了

先日から取り組んでいた以下の書籍を読みおわった。

Excel VBAでパズルを解こう

Excel VBAでパズルを解こう

Chapter9まであって、1は順列の基礎、2~5までは順列の応用問題、6、7、9がバックトラック法による手順問題、8だけ異色の問題だった。

本を買った目的はアルゴリズムを学ぶことであって、全問解くことではなかったので、Chapter 1、2、6、8以外はパラパラと読んでおしまいにした。

今回苦労したのはChapter 8のリングを描こうというもの。

以下のように等間隔にならんだ9つの点のうち、4つの点を通る正円がいくつ描けるかという問題だ。
f:id:t-hom:20150926172326p:plain

14個の円が描けるので、パズルを楽しみたい方は紙と鉛筆で考えてみると良い。

VBAでパズルの解く方法

書籍の解答では、座標を細かく切り分けて走査しするというもの。
f:id:t-hom:20150926173033p:plain

1ピクセル進むごとに9つのそれぞれの点との距離を測り、見つかった数が4つなら、そこを中心に円を描く。

書籍のサポートサイトから解答プログラムをダウンロードして実行してみたが、実行にかかった時間は34.75秒。
ちょっと時間がかかりすぎだ。

今回のように点が等間隔の場合は、全ピクセルを走査する必要はなく、以下の赤点の場所だけチェックすればよい。
f:id:t-hom:20150926174355p:plain

X軸、Y軸ともに120ピクセル分の走査なので、ループのステップを30に設定したところ、13.77秒で終了した。
ただ、点が等間隔でないときには応用が利かないので、書籍のやりかたのほうが汎用性があるといえる。

よりよい方法を求めて試行錯誤。しかし…

すべての座標から9つの点にアプローチするというのは、あまりエレガントな解決方法ではないように思える。
なぜなら、今回はたまたま120*120のループで済んでいるが、サイズが変わればループ回数も増大してしまう。

そこで、この問題を組み合わせ問題として解けないものか考えてみた。
つまり、9個の点のうち4つをとる組み合わせを列挙し、それぞれに対して円が描けるか描けないかを判定させるという方法だ。

しかし、結論から言ってこの試みは失敗した。

まず4点からの中心地を求める方法がわからない。

4点が正方形か長方形なら対角線の交わる位置で良い。
しかし、以下のようなケースでは、台形になってしまい、対角線ではダメだ。
f:id:t-hom:20150926181157p:plain

そこで、次に円にぴったり収まる形に着目した。

  • 正方形、長方形は円にぴったり収まる。
  • 左右対称の台形も収まる。
  • どのような左右非対称の台形も収まらない。
  • どのような平行四辺形はも収まらない。
  • どのようなひし形も収まらない。

しかしここで、上記のどれにも当てはまらない四角形では収まるケースと収まらないケースの違いが明確にできず、挫折した。
幾何学の知識があれば、もう少し頑張ったと思う。

まとめ

今回の試みは失敗したが、それでも別のやり方で解こうとしたことでいろいろ勉強になることもあった。
アルゴリズムの学習は結構面倒くさいところがあるが、まじめに取り組んでみたら面白くてはまってしまった。
次はアルゴリズム大辞典をやろうか、それとも休憩がてら別の言語で遊んでみようかといったところである。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。