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

を実現するプログラム例

#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;

size_t mg = n * (n * n + 1) / 2;

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;

        }

        size_t c = 1;

        for (size_t i = 0; i < n; i++) {

                size_t gk = 0;

                for (size_t j = 0; j < n; j++) {

                        gk += m[(j + i) % n][j];

                }

                cout << "" << i + 1 << "右下がり斜め行合計" << gk << endl;

                if (gk != mg)c = 0;

        }

        if (c == 1) {

                for (size_t i = 0; i < n; i++) {

                        size_t gk = 0;

                        for (size_t j = 0; j < n; j++) {

                                gk += m[(j + n - i) % n][n - 1 - j];

                        }

                        cout << "" << i + 1 << "左下がり斜め行合計" << gk << endl;

                }

        }

        if (c == 1) {

                for (size_t i = 0; i < n; i++) {

                        size_t gk = 0;

                        for (size_t j = 0; j < n; j++) {

                                gk += m[i][j];

                        }

                        cout << "" << i + 1 << "行合計" << gk << endl;

                }

        }

        if (c == 1) {

                for (size_t i = 0; i < n; i++) {

                        size_t gk = 0;

                        for (size_t j = 0; j < n; j++) {

                                gk += m[j][i];

                        }

                        cout << "" << i + 1 << "列合計" << gk << endl;

                }

        }

        if (c == 1)cout << "完全魔方陣です。" << endl; else cout << "完全魔方陣ではありません。" << endl;

        cout << endl;

        for (size_t i = 0; i < n; i++) {

                for (size_t j = 0; j < n; j++) {

                        t1[i][j] = (t1[i][j] + 1) % n;

                }

        }

        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;

                }

        }

        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;

        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;

        }

        c = 1;

        for (size_t i = 0; i < n; i++) {

                size_t gk = 0;

                for (size_t j = 0; j < n; j++) {

                        gk += m[(j + i) % n][j];

                }

                cout << "" << i + 1 << "右下がり斜め行合計" << gk << endl;

                if (gk != mg)c = 0;

        }

        if (c == 1) {

                for (size_t i = 0; i < n; i++) {

                        size_t gk = 0;

                        for (size_t j = 0; j < n; j++) {

                                gk += m[(j + n - i) % n][n - 1 - j];

                        }

                        cout << "" << i + 1 << "左下がり斜め行合計" << gk << endl;

                }

        }

        if (c == 1) {

                for (size_t i = 0; i < n; i++) {

                        size_t gk = 0;

                        for (size_t j = 0; j < n; j++) {

                                gk += m[i][j];

                        }

                        cout << "" << i + 1 << "行合計" << gk << endl;

                }

        }

        if (c == 1) {

                for (size_t i = 0; i < n; i++) {

                        size_t gk = 0;

                        for (size_t j = 0; j < n; j++) {

                                gk += m[j][i];

                        }

                        cout << "" << i + 1 << "列合計" << gk << endl;

                }

        }

        if (c == 1)cout << "完全魔方陣です。" << endl; else cout << "完全魔方陣ではありません。" << endl;

}



第4話に向けての課題です。

種2についても
0→1、1→2、2→3、3→4、4→0とずらしても完全魔方陣になることを検証してください。





第13章第2話へ 第13章4話へ

本講義トップへ