マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第9章 関数の再帰的使用

第9話 トレースに入る前の手による体験その2

プログラムコード再掲

#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

const int n = 5;//具体的な数字を使うのではなく、 n を使うと汎用性のあるプログラムになる!

void n次順列(int s);

int a[25]; //将来5次魔方陣まで生成できるように25に変更

int cn = 0; //anに変更 変更理由はnuberの頭文字nは整数を表す場合が多いからです

int main() {

              n次順列(0);

              cout << endl << "生成された順列は" << cn << "個です。" << endl;//←2026年3月19日訂正

              while (!_kbhit());//待機させるための命令

              return(0);

}

void n次順列(int s) {

              int h;

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

                            if (s == 0)a[s] = i + 1;

                            h = 1;

                            if (s > 0) {

                                          for (int j = 0; j < s; j++) {

                                                        if (a[j] == i + 1) {

                                                                      h = 0;

                                                                      break;

                                                        }

                                          }

                                          if (h == 1)a[s] = i + 1;

                            }

                            if (h == 1) {

                                          if (s + 1 < n) {

                                                        n次順列(s + 1);

                                          }

                                          else {

                                                        for (int j = 0; j < n; j++)cout << a[j];

                                                        cout << " ";

                                                        cn++;

                                                        if (cn % 10 == 0)cout << endl;

                                          }

                            }

              }

}

 


正直に言ってマスが足りないのではないかと思っていましたが、

ドンぴっしゃりでした。

添付エクセルファイル参照してください。

最後のマスはすべてのf世界 = f(0)・f(1)・f(2)が消滅したことを示しています。

すべてのf世界 = f(0)・f(1)・f(2)が消滅してもグローがバル配列a[25]とグローバル変数cnには成果が残っており、


              cout << endl << "生成された順列は" << cn << "個です。" << endl;//←2026年3月19日訂正


で任務が終了します。グローバル配列a[25]を

int a[36]; //将来6次魔方陣まで生成できるように36に変更 と変更して

第10章において3次魔方陣、4次魔方陣、5次魔方陣、6次魔方陣の自動生成に挑戦します。




     






第9章第8話へ 第9章第10話へ

本講義トップへ