第2講 試行錯誤法でヒント数0数独の解答を作る(1)
第4話 5次順列自動生成ソフト


1,2,3,4,5の順列自動生成

  ・
  ・

第2話の回答
#include<iostream>
using namespace std;
int main() {
  int a[5], cn = 0;
  for (int i = 1; i < 6; i++) {
    a[0] = i; //a[0]に1,2,3, 4, 5を入力
    for (int j = 1; j < 6; j++) {
      if (j != a[0]) {
        a[1] = j; //a[0]とa[1]に同じ数字が入らないときに1,2,3, 4, 5を入力
        for (int k = 1; k < 6; k++) {
          if (k != a[0] && k != a[1]) {
            a[2] = k; //a[0]とa[1]とa[2]に同じ数字が入らないときに1,2,3, 4, 5を入力
            for (int l = 1; l < 6; l++) {
              if (l != a[0] && l != a[1] && l != a[2]) {
                a[3] = l; //a[0]とa[1]とa[2]とa[3]のすべてに同じ数字入らないときに1,2,3, 4, 5を入力
                  for (int m = 1; m < 6; m++) {
                    if (m != a[0] && m != a[1] && m != a[2] && m != a[3]) {
                       a[4] = m; //a[0]とa[1]とa[2]とa[3]とのすべてに同じ数字入らないときに1,2,3, 4, 5を入力
                       cn++;
                       cout << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << " " << a[4] << endl;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  cout << "順列の場合の数は" << cn << endl;
  cout << "プロジェクト成功" << endl;
  return(0);
}



皆さんどうですか。

頭が混乱しませんか。

数独は81マスですから、

81次元のプログラムをやりたい人は当然いないですよね。

私もやりたくありません。

for文の81次元展開なんて冗談ではないですよね。

ですが、81次元展開を簡単に実現する方法があるのですよ。

ヒントは


この図です。だたし、第6次順列の場合には、


です。上の番号は部屋番号で、

下はその部屋に泊まるお客さんです。

各部屋は1人部屋なので1人しか泊まれません。

部屋番号について再帰的使用をすれば、複雑極まりなかったプログラムコードは信じられないほど、

すっきりした形になります。

でもここでもいきなりは無理ですから、

次話で考え方を説明します。



第3話へ 第5話へ


トップへ