第10講 添え字付き名前を持った箱(配列)
第1話 添え字付き名前ってどういうこと?


皆さん、
この講義が進むと将来は数独問題自動生成や
魔方陣自動生成に挑戦することになっています。
数独とは、


7
8 3 9
6 4 3
2 6 1 9
1 6
6 4 2 3
9 5 7
1 9 2
8

数字の入っていないセル(升)に次のルールに基づいて
1から9までの数字を埋めていくパズルです。
① 各列(縦列)には同じ数字を入れてはならない。
② 各行(横列)には同じ数字を入れてはならない。
③ 各行ブロックには同じ数字を入れてはならない。
(この問題は、超難問ですので
初心者の方には解くのは非常に困難です。
解いてみたい方は、ぜひ本サイトの数独必勝法の研究 
をご覧ください。)
解答は


1 6 4 3 7 2 9 5 8
8 3 7 5 4 9 2 6 1
5 2 9 6 1 8 7 4 3
3 8 2 7 5 6 4 1 9
7 9 1 8 3 4 6 2 5
6 4 5 2 9 1 3 8 7
9 5 8 4 2 7 1 3 6
4 7 3 1 6 5 8 9 2
2 1 6 9 8 3 5 7 4

です。
魔方陣とは


7 8 27 25 23 21
5 6 28 26 24 22
35 34 19 20 1 2
33 36 17 18 4 3
15 13 11 12 29 31
16 14 9 10 30 32

というような方陣です。
この方陣をよく観察してください。
どうなってますか。
そうです。
各行・各列の合計がすべて同じ111です。
それだけですか。
対角線合計もそれぞれ111です。
人間が魔方陣を完成させるのでは大変ですが、
コンピュータなら1秒に6次魔方陣(1辺が6である魔方陣)を
数万個のレベルで作成できてしまいます。
6次魔方陣どころか、26次魔方陣でさえ(

19 20 38 39 77 78 119 120 194 195 237 238 279 280 318 319 177 178
17 18 37 40 79 80 117 118 193 196 239 240 277 278 317 320 179 180
72 70 91 89 112 109 188 186 227 225 268 265 312 310 171 169 32 29
71 69 90 92 110 111 187 185 226 228 266 267 311 309 170 172 30 31
101 104 144 142 197 199 217 220 260 258 297 299 157 160 24 22 61 63
103 102 143 141 200 198 219 218 259 257 300 298 159 158 23 21 64 62
135 136 210 211 249 250 271 272 290 291 149 150 11 12 50 51 93 94
133 134 209 212 251 252 269 270 289 292 151 152 9 10 49 52 95 96
204 202 243 241 284 281 324 322 163 161 4 1 44 42 83 81 124 121
203 201 242 244 282 283 323 321 162 164 2 3 43 41 82 84 122 123
229 232 276 274 313 315 173 176 36 34 53 55 73 76 116 114 189 191
231 230 275 273 316 314 175 174 35 33 56 54 75 74 115 113 192 190
263 264 302 303 165 166 27 28 66 67 105 106 127 128 182 183 221 222
261 262 301 304 167 168 25 26 65 68 107 108 125 126 181 184 223 224
296 294 155 153 16 13 60 58 99 97 140 137 216 214 235 233 256 253
295 293 154 156 14 15 59 57 98 100 138 139 215 213 234 236 254 255
145 148 8 6 45 47 85 88 132 130 205 207 245 248 288 286 305 307
147 146 7 5 48 46 87 86 131 129 208 206 247 246 287 285 308 306

これが26次魔方陣の1つ、
26次魔方陣数は京×京×京×京以上あるのは確実です。
6次魔方陣でさえいくつあるかは現時点ではわかったいません。)、
1秒に数百の速さで魔方陣を作り出すことができるようになります。
もちろん、プログラムはかなり工夫が必要です。
例えば、すべての可能な場合を作り出して
その中から魔方陣になっているものを探すというようなプログラムでは、
スーパコンピュータ京(つい最近まで世界1だったスパコン)
で数百年計算させ続けたとしても、
1個も見つけることはできないでしょう。
それが工夫次第では、
パソコンでさえ1秒で数百個もの26次魔方陣を発見できるようになる!
これがプログラムのおもしろさです。

さて、26次魔方陣を生成させるとなると、
数字を収めておく箱(変数)は、
26×26=676個も必要です。
これでは箱の名前を考えるだけで大変ですし、
Dim a As Integer,b As Integer,c As Integer,・・・・・
宣言もうんざりです。
実はこれを簡単に解消する方法があります。
それが添え付き変数、すなわち配列です。
例えば、
Dim a(100) As Integer
宣言するだけで整数を入れる箱は101個用意されるです。
用意された箱は
a(0)
a(1)
 ・
 ・
 ・
a(100)
(a(0)が入るので101個になります。)
です。()中の
数字が添え字です。
(C言語・C++・Javaなどの場合、
int a[10]という宣言で用意される箱は、
10個にすぎません。
a[10]が認められないからです。
すなわち、用意される箱は
a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]
の10個です。)
この配列なら例え、100000001個の箱であろうと
1行の宣言文で用意できてしまいます。
Dim a(100000000) As Integer
(a(0)が入るので100000001個です。)

では、簡単な演習をしてみましょう。
配列a(9)を用意して(添え字0があるので、箱は10個作られる。)、
a(0)からa(9)まで順に1から10まで代入して、
それを表示するマクロを考えてみてください。
vba
配列の始まりは、
a(1)ではなく、a(0)であることに注意しましょう。
また、配列の終わりは
a(10)ではなく、a(9)であることにも注意しましょう。




第9講第9話へ 第2話へ

トップ

vc++講義へ

初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義へ
VB講義基礎へ
初心者のためのJava 入門 基礎から応用まで
数学研究室に戻る