マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第13章 様々な魔方陣の作成および自動生成
第2話 5次魔方陣作成プログラム

(
種1
0 1 2 3 4
3 4 0 1 2
1 2 3 4 0
4 0 1 2 3
2 3 4 0 1
種2
0 1 2 3 4
2 3 4 0 1
4 0 1 2 3
1 2 3 4 0
3 4 0 1 2
魔方陣表示
1 7 13 19 25
18 24 5 6 12
10 11 17 23 4
22 3 9 15 16
14 20 21 2 8
プロジェクト終了
)
を実現するコード例
#include<iostream>//インクルードファイルiostreamの読み込み
#include<conio.h>//while(!_kbhit());を使うためのお呪い
#include<string> //文字列変数を使えるようにするために組み込む
#include <iomanip> //setprecisionを使えるように組み込む
#include <cmath>//powなどを使うときに必要
#include <ctime>//time()(←現時刻発生する関数)を使うために必要
using namespace std;//coutを使うときに必要なお呪い
void 魔方陣作成関数();
const size_t n = 5;
int main() {//私は社長だ。
魔方陣作成関数();
cout << endl;
cout << "プロジェクト終了" << endl;
while (!_kbhit());//待機させるための命令
return 0;//int main() を終わるためのお呪い
}
void 魔方陣作成関数() {
size_t t1[n][n],t2[n][n];//魔方陣の種を収納する2次元配列
size_t m[n][n];//5次魔方陣を収納する2次元配列
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < n; j++) {
t1[i][j] = (j + 3 * i) % n;
t2[i][j] = (j + 2 * i) % n;
}
}
cout << "種1" << endl;
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < n; j++) {
cout << " " << t1[i][j] << " ";
}
cout << endl;
}
cout << endl;
cout << "種2" << endl;
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < n; j++) {
cout << " " << t2[i][j] << " ";
}
cout << endl;
}
//5次魔方陣作成
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < n; j++) {
m[i][j] = n * t1[i][j] + t2[i][j] + 1;
}
}
//5次魔方陣表示
cout << endl;
cout << "魔方陣表示" << endl;
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < n; j++) {
if (m[i][j] < 10) {
cout << " " << m[i][j] << " ";
}
else {
cout << m[i][j] << " ";
}
}
cout << endl;
}
}
第1話の謎を解くための課題

今回は種1の数字のみをずらします。
0→1、1→2、2→3、3→4、4→0
と変更します。
上の実行画面は元の完全方陣

と数字をずらした方陣

がいずれも完全魔方陣になっていることを示しています。
実行画面を実現するプログラムを組みことが第3話に向けての課題です。
すべての斜め行とすべての行とすべての列の合計が同じなっていることで、
完全魔方陣であること検証して、
合格の場合は
![]()
と表示することも条件です。
昨日の課題は誤りでした。心よりお詫び申し上げます。数字をずらしてよいのは種の方のみです。