第2講 局所リスト構造解析
第4話 ブロックはどう動かすの?
r
オレンジ()に入っている数字とのブロック内の重複を調べるとき
緑のセルとの重なりを調べれば良いのですが、
緑の部分を動かすには、
ブロックの先頭の座標(
z
を作り出さなければなりません。
)を始まりにしてFor文で動かせば良いのです。
つまり、()から()を作り出すことが課題になります。
今は具体的な数字で説明していますが、
文字(y(g), x(g))やi等から作り出さないと、一般的にはなりません。
プログラムが汎用的になるためには、
コードは可能な限り一般的にしなければなりません。
どうしたらよいでしょうか。
答は例によって30行下。





































  Dim ybs As Byte, xbs As Byte
  Dim isy As Byte, ia As Byte
  ybs = rn * Int(y(g) / rn)
  xbs = rn * Int(x(g) / rn)
  For i = 0 To n - 1
    isy = Int(i / rn)
    ia = i Mod rn
    If ybs + isy <> y(g) And xbs + ia <> x(g) And p(ybs + isy, xbs + ia) = 0 Then
             ・
             ・
解説
z
  ybs = rn * Int(y(g) / rn)
  xbs = rn * Int(x(g) / rn)
です。()の場合で、実際に計算してみると、
  ybs = rn * Int(y(g) / rn) = 3 * Int(4 / 3) = 3 * 1 = 3
  xbs = rn * Int(x(g) / rn) = 3 * Int(5 / 3) = 3 * 1 = 3
で、確かに()から()が作り出されています。
k
は2次元ですから、2次元For文にしても良いのですが、
1次元For文で動かす方法があります。
それが、
    isy = Int(i / rn)
    ia = i Mod rn
です。
実際に、iを0から8まで動かすと、
i = 0 のとき、
    isy = Int(i / rn) = Int(0 / 3) = 0
    ia = i Mod rn = 0 mod 3 = 0
i = 1 のとき、
    isy = Int(i / rn) = Int(1 / 3) = 0
    ia = i Mod rn = 1 mod 3 = 1
i = 2 のとき、
    isy = Int(i / rn) = Int(2 / 3) = 0
    ia = i Mod rn = 2 mod 3 = 2
i = 3 のとき、
    isy = Int(i / rn) = Int(3 / 3) = 1
    ia = i Mod rn = 3 mod 3 = 0
i = 4 のとき、
    isy = Int(i / rn) = Int(4 / 3) = 1
    ia = i Mod rn = 4 mod 3 = 1
i = 5 のとき、
    isy = Int(i / rn) = Int(5 / 3) = 1
    ia = i Mod rn = 5 mod 3 = 2
i = 6 のとき、
    isy = Int(i / rn) = Int(6 / 3) = 2
    ia = i Mod rn = 6 mod 3 = 0
i = 7 のとき、
    isy = Int(i / rn) = Int(7 / 3) = 2
    ia = i Mod rn = 7 mod 3 = 1
i = 8 のとき、
    isy = Int(i / rn) = Int(8 / 3) = 2
    ia = i Mod rn = 8 mod 3 = 2
ですから、順に
(0,0)、(0,1)、(0,2)、(1,0)、(1,1)、(1,2)、(2,0)、(2,1)、(2,2)
が実現できていますね。
  Dim ybs As Byte, xbs As Byte
  Dim isy As Byte, ia As Byte
  ybs = rn * Int(y(g) / rn)
  xbs = rn * Int(x(g) / rn)
  For i = 0 To n - 1
    isy = Int(i / rn)
    ia = i Mod rn
この手法是非覚えて下さい。
理由は、行・列を動かすとき、For文は1次元ですから、
ブロックも1次元に合わせたいのです。
結局、ブロックも行・列と本質はまったく同じなのです。
1次元に合わせておくとコードも基本的に同じなり、
コピペと置換を組み合わせれば、行のコードから簡単に作り直せます。
尚、ybs + isy <> y(g) And xbs + ia <> x(g) And が入っているのは
n
白のセルは動かさないようにするためです。
白のセルは行と列で検査済みですから。

では、第3話と第4話の説明を参考にして、局所リスト構造解析を組み入れることによって、
第1講第6話の 参考ダウンロード 添付ファイルを改良して
aのように、
どの行にもどの列にもどのブロックにも数字が重複しないように、
配置するプログラムを考えていきましょう。
以上の説明があっても、まだまだ乗り越えなければならない課題がたくさんあり、
プログラムを組むのは大変難しいといえますので、
課題は何でどう解消すべきかを次話で説明しましょう。


第3話へ 第5話へ
004

eclipse c++ 入門
魔方陣 数独(ナンプレ)で学ぶ VBA 入門
数独(ナンプレ)のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ