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

第5話 関数の再帰的方法によるプログラムコードの組み直し

#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 f(int s);//順列生成関数←引数名をgからsに変更(2026年3月19日)

 

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

 

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

 

int main() {

 

              f(0);

 

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

 

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

 

              return(0);

 

}

void f(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) {

 

                                                        f(s + 1);

 

                                          }

                                          else {

 

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

 

                                                        cout << " ";

 

                                                        cn++;

 

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

 

                                          }

                            }

              }

}



このコードなら n を変更するだけでいかなる
n 次順列を生成できます。

n = 5 の場合の実験結果


12345 12354 12435 12453 12534 12543 13245 13254 13425 13452
13524 13542 14235 14253 14325 14352 14523 14532 15234 15243
15324 15342 15423 15432 21345 21354 21435 21453 21534 21543
23145 23154 23415 23451 23514 23541 24135 24153 24315 24351
24513 24531 25134 25143 25314 25341 25413 25431 31245 31254
31425 31452 31524 31542 32145 32154 32415 32451 32514 32541
34125 34152 34215 34251 34512 34521 35124 35142 35214 35241
35412 35421 41235 41253 41325 41352 41523 41532 42135 42153
42315 42351 42513 42531 43125 43152 43215 43251 43512 43521
45123 45132 45213 45231 45312 45321 51234 51243 51324 51342
51423 51432 52134 52143 52314 52341 52413 52431 53124 53142
53214 53241 53412 53421 54123 54132 54213 54231 54312 54321
生成された順列は120個です。


n = 6 の場合の実験結果



513624 513642 514236 514263 514326 514362 514623 514632 516234 516243
516324 516342 516423 516432 521346 521364 521436 521463 521634 521643
523146 523164 523416 523461 523614 523641 524136 524163 524316 524361
524613 524631 526134 526143 526314 526341 526413 526431 531246 531264
531426 531462 531624 531642 532146 532164 532416 532461 532614 532641
534126 534162 534216 534261 534612 534621 536124 536142 536214 536241
536412 536421 541236 541263 541326 541362 541623 541632 542136 542163
542316 542361 542613 542631 543126 543162 543216 543261 543612 543621
546123 546132 546213 546231 546312 546321 561234 561243 561324 561342
561423 561432 562134 562143 562314 562341 562413 562431 563124 563142
563214 563241 563412 563421 564123 564132 564213 564231 564312 564321
612345 612354 612435 612453 612534 612543 613245 613254 613425 613452
613524 613542 614235 614253 614325 614352 614523 614532 615234 615243
615324 615342 615423 615432 621345 621354 621435 621453 621534 621543
623145 623154 623415 623451 623514 623541 624135 624153 624315 624351
624513 624531 625134 625143 625314 625341 625413 625431 631245 631254
631425 631452 631524 631542 632145 632154 632415 632451 632514 632541
634125 634152 634215 634251 634512 634521 635124 635142 635214 635241
635412 635421 641235 641253 641325 641352 641523 641532 642135 642153
642315 642351 642513 642531 643125 643152 643215 643251 643512 643521
645123 645132 645213 645231 645312 645321 651234 651243 651324 651342
651423 651432 652134 652143 652314 652341 652413 652431 653124 653142
653214 653241 653412 653421 654123 654132 654213 654231 654312 654321
生成された順列は720個です。


全然意味が分からないよ!という悲鳴が皆さんから聞こえてきそうです。

でも大丈夫です。

第6話で極めて丁寧に説明します。

1人たりとも取りこぼしません。



第9章第4話へ 第9章第6話へ

本講義トップへ