マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第4章 if文(もしもボックス))
第13話 4次魔方陣の作成

(
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
)
を実現するコード例
#include<iostream>//インクルードファイルiostreamの読み込み
#include<conio.h>//while(!_kbhit());を使うためのお呪い
#include<string> //文字列変数を使えるようにするために組み込む
#include <iomanip> //setprecisionを使えるように組み込む
#include <cmath>//powなどを使うときに必要
#include <ctime>//time()(←現時刻発生する関数)を使うために必要
using namespace std;//coutを使うときに必要なお呪い
void 2次元for文();//横と縦の2方向を持つ2次元for文体験
int main() {//私は社長だ。
2次元for文();
while (!_kbhit());//待機させるための命令
return(0);//int main()終わるためのお呪い
}
void 2次元for文() {
//横と縦の2方向を持つ2次元for文体験
int a00, a01, a02, a03;//1行目の行列の数字を収納する変数
int a10, a11, a12, a13;//2行目の行列の数字を収納する変数
int a30, a31, a32, a33;//4行目の行列の数字を収納する変数
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (i == 0 && j == 0)a00 = 4 * i + j + 1;
if (i == 0 && j == 1)a01 = 4 * i + j + 1;
if (i == 0 && j == 2)a02 = 4 * i + j + 1;
if (i == 0 && j == 3)a03 = 4 * i + j + 1;
if (i == 1 && j == 0)a10 = 4 * i + j + 1;
if (i == 1 && j == 1)a11 = 4 * i + j + 1;
if (i == 1 && j == 2)a12 = 4 * i + j + 1;
if (i == 1 && j == 3)a13 = 4 * i + j + 1;
if (i == 2 && j == 0)a20 = 4 * i + j + 1;
if (i == 2 && j == 1)a21 = 4 * i + j + 1;
if (i == 2 && j == 2)a22 = 4 * i + j + 1;
if (i == 2 && j == 3)a23 = 4 * i + j + 1;
if (i == 3 && j == 0)a30 = 4 * i + j + 1;
if (i == 3 && j == 1)a31 = 4 * i + j + 1;
if (i == 3 && j == 3)a33 = 4 * i + j + 1;
}
}
cout << " " << a00 << " " << a01 << " " << a02 << " " << a03 << endl;
cout << " " << a10 << " " << a11 << " " << a12 << " " << a13 << endl;
cout << " " << a20 << " " << a21 << " " << a22 << " " << a23 << endl;
cout << a30 << " " << a31 << " " << a32 << " " << a33 << endl;
w = a00;
a00 = a33;
a33 = w;
w = a11;
a11 = a22;
a22 = w;
w = a03;
a03 = a30;
a30 = w;
w = a12;
a12 = a21;
a21 = w;
cout << endl;
cout << a00 << " " << a01 << " " << a02 << " " << a03 << endl;
cout << " " << a10 << " " << a11 << " " << a12 << " " << a13 << endl;
cout << " " << a20 << " " << a21 << " " << a22 << " " << a23 << endl;
cout << " " << a30 << " " << a31 << " " << a32 << " " << a33 << endl;
}
難問中の難問を解けた方は誇りに思ってよいと思います。
私でさえ苦戦したのですから。
実は、もう一つ4次魔方陣を作る方法があります。
| 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 |
対角線ではなく色のついている数字を中心に対して点対称移動をするという方法です。
| 1 | 15 | 14 | 4 |
| 12 | 6 | 7 | 9 |
| 8 | 10 | 11 | 5 |
| 13 | 3 | 2 | 16 |
実際に各行・各列・各対角線の合計を計算してみてください。
1行目 1 + 15 +14 + 4 = 34
2行目 12 + 6 + 7 + 9 = 34
3行目 8 + 10 + 11 + 5 = 34
4行目 13 + 3 + 2 + 16 = 34
1列目 1 + 12 + 8 + 13 = 34
2列目 15 + 6 + 10 + 3 = 34
3列目 14 + 7 + 11 + 2 = 34
4列目 4 + 9 + 5 + 16 = 34
対角線 1 + 6 + 11 + 16 = 34
逆対角線 4 + 7 + 10 + 13 = 34
確かにすべての合計が34になっており、
4次魔方陣です。
今回の交換は
a01 と a32
a02 と a31
a10 と a23
a02 と a13
です。この方法のコードを作ってください。

(
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
1 15 14 4
12 6 7 9
8 10 11 5
13 3 2 16
)
第4章第12話へ 第4章第14話へ
本講義トップへ