第10講 魔方陣自動生成アプリ
第7話 始まりをランダムにして、しかもすべて網羅するためには?

遂に魔方陣が完成しました。
int m[5][5]; //少し大きめに配列要素数を取っておく
と一応5次魔方陣まで、作成できるように配列要素数を取ってありますが、
このアプリでは4次が限界です。
5次は待てでも待てどもでてきません。
このアプリを改善させて作成速度を1万倍、1億倍、1京倍にしていくことによって、
26次魔方陣クラスでも1秒で数百の単位で生成できるようにしていきます。
5次以上は根本的な改良が必要です。

ですが、将来の根本的な改造のために
小改良をしておきます。
その改良とは、各セル(ます)に入れる数字を
1,2,3,・・・,24,25の順で入れているのではなく、
セルごとに始まりの数字をランダムにして、
7,8,・・・,25,1,2,3,4,5,6
11,12,・・・,25,1,2,3,4,5,・・・,10
15,16,・・・,25,1,2,3,4,5,・・・,14
のように、試す順番を試すのです。
では、
7,8,・・・,25,1,2,3,4,5,6
等はどうしたら実現できるのでしょうか。
始まりをランダムにするには、
もちろん乱数を使います。
(第15講で再び魔方陣を取り上げます。
この改造によって、乱数系列を工夫すれば、
5次魔方陣は100個程度であれば数分でできるようになります。
将来、様々な乱数系列を試すために、
srand(・)を入れておきましょう。
・のシード値を様々試して第15講で8次程度まで出来るようにします。)
では、
7,8,・・・,25,1,2,3,4,5,6
等は、整数型整数ihを用意しておいて、
  ih=rand()%(n*n);
  for(i=ih;i<n*n;i++){
    m[y][x]=i+1;
とすれば良いでしょうか。
答は30行下。




















答え
  for(i=ih;i<n*n;i++){
    m[y][x]=i+1;
ではもちろんダメです。
ih=6の場合確かに、i+1ですから確かに始まりは7です。
しかし、
7,8,9,・・・,24,25
で終わってしまいます。
1,2,3,4,5,6
が抜け落ちてしまいます。
では、
ヒントは、%を使うです。
答を30行下に示します。




















答え
  for(i=0;i<n*n;i++){
    m[y][x]=((ih+i)%(n*n))+1;
です。
ih=6,n=5の場合でトレースしてみましょう。
i=0のとき、
   ((ih+i)%(n*n))+1=((6+0)%(5*5))+1=(6%25)+1=6+1=7
i=0のとき、
   ((ih+i)%(n*n))+1=((6+1)%(5*5))+1=(7%25)+1=7+1=8
i=0のとき、
   ((ih+i)%(n*n))+1=((6+2)%(5*5))+1=(8%25)+1=8+1=9
       ・
       ・
i=17のとき、
   ((ih+i)%(n*n))+1=((6+17)%(5*5))+1=(23%25)+1=23+1=24
i=18のとき、
   ((ih+i)%(n*n))+1=((6+18)%(5*5))+1=(24%25)+1=24+1=25
i=19のとき、
   ((ih+i)%(n*n))+1=((6+19)%(5*5))+1=(25%25)+1=0+1=1
i=20のとき、
   ((ih+i)%(n*n))+1=((6+20)%(5*5))+1=(26%25)+1=1+1=2
       ・
       ・
i=23のとき、
   ((ih+i)%(n*n))+1=((6+23)%(5*5))+1=(29%25)+1=4+1=5
i=24のとき、
   ((ih+i)%(n*n))+1=((6+24)%(5*5))+1=(30%25)+1=5+1=6
で確かに
7,8,・・・,25,1,2,3,4,5,6
が実現できています。
この改良でも、5次は歯が立ちませんが、
srand(1);のときの4次の結果を示しておくと、
n=4
10 04 15 05
07 13 02 12
06 16 03 09
11 01 14 08

10 04 15 05
07 13 02 12
01 11 08 14
16 06 09 03

10 04 15 05
13 07 12 02
03 09 06 16
08 14 01 11

10 04 15 05
13 07 12 02
08 14 01 11
03 09 06 16

10 04 05 15
13 07 02 12
03 09 16 06
08 14 11 01

10 04 05 15
13 07 02 12
08 14 11 01
03 09 16 06

10 04 05 15
07 13 12 02
11 01 08 14
06 16 09 03

10 04 05 15
07 13 12 02
16 06 03 09
01 11 14 08

10 04 07 13
15 05 02 12
01 11 16 06
08 14 09 03

10 04 07 13
15 05 02 12
06 16 11 01
03 09 14 08

生成された4次魔方陣=10

かなりランダムになりました。
では皆さんこのアプリを作って下さい。
乱数を使うときには、
#include<stdlib.h>
を忘れないようにしましょう。

第6話へ 第8話へ

a


初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ