趣味のIT
自宅サーバーの構築
ApacheとTomcatの連携
Javaのインストール
JavaWebStartの実装
Webプログラミング
JavaScript
Java Applet
PHP
Java Web Start
エクセルプログラミング
VBAでお絵かき←
値を貼り付け
セル参照

エクセルプログラミング

VBAでお絵かき

お絵かきパズルを自動的に解くなどということは、パズラーにとっては具の骨頂!何の意味もないことでしょう。
が、今回はアルゴリズムの勉強ということで挑戦してみました。
実際、完成して実行させてみると「正確に」数値を入れなければ正しい結果が出てこないで(あたりまえ!!)、 特に大きなお絵かきでは何度も数字の確認が必要です。
これが結構苦痛であり、実行させるとトロトロと計算を続けるだけで、あまり楽しいソフトではありません。
それはともかく、一応完成しましたので公開します。基本的な考え方は次の2つです。

考え方

手法1: ドットを仮定して確定する
Step0 【例】
列の幅が10
配置する値が2と4だったとする
このとき、9番目にはドットが入らないことが確定しているとする

Step1 枠の中の1列を取り出してドットの塊り(ランドと呼ぶ)を片方から配置していく。
【例】
端から順にランドを置いていく
まずは左端に2つのドットを持ったランドを置く

次にひとつスペースを置いて、4つのドットを置く

Step2 配置していく段階で確定済みのドットと矛盾が生じた場合には配置をキャンセルする。
【例】
これでこの列の配置が完成した
確定済みのドット(9番目のドット)と矛盾がないか確認する

Step3 配置が完了したら、その状態でドットの有無を記録する。
【例】
矛盾がないのでこの配置は有効とする

Step4 ランドを片方から順次、ひとつずつ移動していく。
【例】
では2番目に配置したランドをひとつ移動して配置する

矛盾がないのでこの配置も有効であるく

次に1番目に配置したランドをひとつ移動して確認する

更に2番目のランドをもうひとつ移動して配置しようとする
しかし、確定済みのドットと矛盾してランドが置けない

最後まで動かしてもダメ

Step5 移動した結果、ドットの矛盾を検証して全ての配置が終わったら記録する。
Step6 全てのランドについて移動可能な部分を調査して未確定な部分をすべて調査する。
【例】
以上で有効な配置は3種類であることがわかる
それぞれを比較してみる

Step7 以上の調査結果、変化しなかったドットを確定部とする。
【例】
結果、ドットガが必ず入る部分と入らない部分が確定する

Step8 以上の作業を上から下まで全行にわたって行う
更に今度は縦方向に左から右まで全列を検証する

これを何度も繰り返して、確定部分を増やしていく
全てのドットが確定したら完了
手法2: 端部から確定範囲を広げる
A ある列の端部から端部のランドの長さだけ調査する。
B ランドの長さ分よりも短い位置に■ドットがあればそこからランドの長さ分だけ■になる。
【例】
C 逆に×ドットがあればそこから端までは×ドットとなる。
【例】
D ■ドットの場合、更に内側に×ドットを調査し、×があれば■がそれだけ外側に伸びる。
【例】
E また、■ドットの数が指定された長さと同じならば、両端とその外側は×となる。
【例】

更に手法Cを使って
F 以上で確定した中に×があれば更にその内側についても同様に調べられる。
G 以上を枠の縦、横の1列毎に対し両側から調査してドットを設定していく。

プログラミング言語

基本的になんでもプログラミングできますが、今回は計算結果が簡単に表示できるようにエクセルのVBAを使います。

ダウンロード

ダウンロード(対象を保存してください)
VBAを使っていますので、エクセルを起動するときにセキュリティの設定次第では起動できない場合があります。
エクセルのセキュリティレベルは中以下に設定してください。(詳しくはヘルプを・・・)

マクロウィルスが怖いという人は、ここにテキストを置いておきます。 中身を見てから自分のエクセルでVBAでモジュールに貼って実行してください。

【方法】
  1. 新規のブックにを開きます。「ツール」メニューから「マクロ」→「VisualVasic Editor」を指定します。
  2. 「挿入」→「標準モジュール」でモジュールを設定し、ダウンロードしたテキストをすべてコピーして貼り付けます。
  3. Initialize の中の変数4つを適宜設定して実行すると画面設定されます。数値入力後、Start で計算開始します。

Copyright (C) 2006 T.Fujiwara , All rights reserved.