第13講 ベクタを利用して4次魔方陣を作ろう!
第1話 4次魔方陣と6次魔方陣の作り方
『第8講 for文・if文・配列・ポインタを総動員して3次魔方陣の自動生成に挑戦する!』
では、3次魔方陣の自動生成に挑戦しました。
これは、コンピュータが自ら思考して、
魔方陣をすべて発見するというものでした。
第13講と第14講で扱おうとしている魔方陣作成は、
コンピュータに発見させようとするものではなく、
4次魔方陣と6次魔方陣の作成規則の通りに、
コンピュータを動かさせて、
4次魔方陣と6次魔方陣を作成するというものです。
第13講で4次魔方陣を扱い、第14講で6次魔方陣を扱います。
実は、4次魔方陣と6次魔方陣には、
簡単な作り方があるのです。
c言語 c++ 入門 初心者 vc++ 使い方 プログラミング 基礎から応用まで
(私のはじめてのVC++入門講義)
において、作り方を説明していますのでそのまま引用します。
---以下引用---
4次魔方陣の方から説明しましょう。
まず、普通の自然配列を考えます。
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
この段階ですでに対角線の合計が34になっています。そして、
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
対角線のところを4次方陣の真ん中を中心にして点対称移動をしてみましょう。
16 | 2 | 3 | 13 |
5 | 11 | 10 | 8 |
9 | 7 | 6 | 12 |
4 | 14 | 15 | 1 |
16 | 2 | 3 | 13 |
5 | 11 | 10 | 8 |
9 | 7 | 6 | 12 |
4 | 14 | 15 | 1 |
そうすると不思議なことに、すべての横合計、縦合計が同じ34になっています。
つまり、4次魔方陣が完成してしまったわけです。
6次魔方陣になるともう少し複雑ですが、似た方法でできます。
最初に自然配列を作ります。
1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 |
そして、
1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 |
ピンクは中心に対して点対称移動、
薄緑は中央の直線に対して上下に線対称移動、
紺色は中央の直線に対して左右に線対称移動
を行います。すると、
36 | 32 | 4 | 3 | 5 | 31 |
12 | 29 | 27 | 10 | 26 | 7 |
19 | 17 | 22 | 21 | 14 | 18 |
13 | 20 | 16 | 15 | 23 | 24 |
25 | 11 | 9 | 28 | 8 | 30 |
6 | 2 | 33 | 34 | 35 | 1 |
36 | 32 | 4 | 3 | 5 | 31 |
12 | 29 | 27 | 10 | 26 | 7 |
19 | 17 | 22 | 21 | 14 | 18 |
13 | 20 | 16 | 15 | 23 | 24 |
25 | 11 | 9 | 28 | 8 | 30 |
6 | 2 | 33 | 34 | 35 | 1 |
となり6次魔方陣が完成します。
(これを不思議だと感じた方は、是非とも魔方陣をクリックしてすべてのページに目を通してください。
いまでこそ初心者のためのVisual Basic入門講義での訪問者が第1位になるようになりましたが
(そしておそらく初心者のためのVisual C++入門講義基礎編がまもなくそれに迫るでしょうが。)、
以前の本サイトの最大ヒット数を稼いだページは魔方陣でした。
本サイトは、魔方陣の研究から始まったのです。)
---以上引用---
この簡単な規則をコンピュータに教えて、
魔方陣を作成するわけですが、
結構難しいですよ。
ですが、ここまで講義を読んできた聡明な皆さんなら、
以下の話を読まなくても、
作成できるかも知れません。
是非、ご自分でも挑戦してから、
以下の講義を読んで頂ければと思います、
と言いたいところですが、
初心者の方は、おそらく次話を読まないと、
困難だと思われます。
それは、データの交換ということです。
つまり、
#include<iostream>
using namespace std;
void main(){
int a,b;
a=5;
b=8;
cout<<"a="<<a<<" "<<"b="<<b<<endl;
・・・
・・・
・・・
cout<<"a="<<a<<" "<<"b="<<b<<endl;
cout<<"プロジェクト終了"<<endl;
}
の実行結果が
a=5 b=8
a=8 b=5
プロジェクト終了
となるようなプログラムを考えるにはどうしたらよいでしょうか。
・・・
・・・
・・・
の内容を考えて下さい。
第12講第14話へ 第2話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ